本節書摘來異步社群《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) &&
(key2 instanceof rsaprivatekey)) {
if ((((rsakey) key1).getmodulus().equals(
((rsakey) key2).getmodulus())) &&
(((rsaprivatekey) key1).getprivateexponent().equals(
((rsaprivatekey) key2).getprivateexponent()))) {
return true;
}
return false;
}<code>`</code>
使用<code>object.equals()</code>比較密鑰可能會産生意想不到的結果。