天天看點

《Java編碼指南:編寫安全可靠程式的75條建議》—— 指南11:不要使用Object.equals()來比較密鑰

本節書摘來異步社群《java編碼指南:編寫安全可靠程式的75條建議》一書中的第1章,第1.11節,作者:【美】fred long(弗雷德•朗), dhruv mohindra(德魯•莫欣達), robert c.seacord(羅伯特 c.西科德), dean f.sutherland(迪恩 f.薩瑟蘭), david svoboda(大衛•斯沃博達),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

<code>java.lang.object.equals()</code>方法,在預設情況下是無法比較複合對象(如密鑰)的。大多數key類都沒能提供覆寫object.equals()方法的equals()實作。在這種情況下,複合對象的元件必須單獨進行比較,以確定正确性。

下面的違規代碼示例使用equals()方法比較兩個密鑰。即使它們代表相同的值,也有可能被視為不相等。

private static boolean keysequal(key key1, key key2) {

 if (key1.equals(key2)) {

  return true;

 }

 if (arrays.equals(key1.getencoded(), key2.getencoded())) {

 // more code for different types of keys here

 // for example, the following code can check whether

 // an rsaprivatekey and an rsaprivatecrtkey are equal

 if ((key1 instanceof rsaprivatekey) &amp;&amp;

   (key2 instanceof rsaprivatekey)) {

  if ((((rsakey) key1).getmodulus().equals(

      ((rsakey) key2).getmodulus())) &amp;&amp;

    (((rsaprivatekey) key1).getprivateexponent().equals(

     ((rsaprivatekey) key2).getprivateexponent()))) {

   return true;

  }

 return false;

}<code>`</code>

使用<code>object.equals()</code>比較密鑰可能會産生意想不到的結果。