天天看点

《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>比较密钥可能会产生意想不到的结果。