《Java编码指南:编写安全可靠程序的75条建议》—— 指南11:不要使用Object.equals()来比较密钥...

    xiaoxiao2024-05-28  106

    本节书摘来异步社区《Java编码指南:编写安全可靠程序的75条建议》一书中的第1章,第1.11节,作者:【美】Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达), Robert C.Seacord(罗伯特 C.西科德), Dean F.Sutherland(迪恩 F.萨瑟兰), David Svoboda(大卫•斯沃博达),更多章节内容可以访问云栖社区“异步社区”公众号查看。

    指南11:不要使用Object.equals()来比较密钥

    java.lang.Object.equals()方法,在默认情况下是无法比较复合对象(如密钥)的。大多数Key类都没能提供覆盖Object.equals()方法的equals()实现。在这种情况下,复合对象的组件必须单独进行比较,以确保正确性。

    违规代码示例

    下面的违规代码示例使用equals()方法比较两个密钥。即使它们代表相同的值,也有可能被视为不相等。

    private static boolean keysEqual(Key key1, Key key2) {  if (key1.equals(key2)) {   return true;  }  return false; }``` ####合规解决方案 下面的合规解决方案首先使用equals()方法进行检查,如果不相等,则继续比较密钥的编码版本,这可以使密钥比对逻辑和密钥提供方实现逻辑解耦。如果还不相等,则进一步比较RSAPrivateKey和RSAPrivateCrtKey是否表示同一个私钥[Oracle 2011b]。上述三步中,任何一步相等,都直接返回相等。

    private static boolean keysEqual(Key key1, Key key2) { if (key1.equals(key2)) {  return true; }

     if (Arrays.equals(key1.getEncoded(), key2.getEncoded())) {  return true; }

     // 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;}`

    自动检测

    使用Object.equals()比较密钥可能会产生意想不到的结果。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)