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

开发者社区> 异步社区> 正文

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

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

本节书摘来异步社区《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()比较密钥可能会产生意想不到的结果。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
编写安全代码——小心有符号数的右移操作(转载)
作者:gfree.wind@gmail.com 博客:blog.focus-linux.net     linuxfocus.
761 0
《Java安全编码标准》一1.4 效能泄露
本节书摘来自华章出版社《Java安全编码标准》一书中的第1章,第1.4节,作者 (美)Fred Long,Dhruv Mohindra,Robert C. Seacord,Dean F. Sutherland,David Svoboda,更多章节内容可以访问云栖社区“华章计算机”公众号查看
786 0
java安全编码指南之:线程安全规则
如果我们在多线程中引入了共享变量,那么我们就需要考虑一下多线程下线程安全的问题了。那么我们在编写代码的过程中,需要注意哪些线程安全的问题呢?
2775 0
全网首发:使用安卓MediaCodec Encoder进行编码时的方向问题
全网首发:使用安卓MediaCodec Encoder进行编码时的方向问题
12 0
用二进制来编码字符串"adceadaa",需要能够相据编码,解码回原来的字符串,则至少需要二进制字符的长度是?
利用哈夫曼编码,字符出现的频率越大,则使用越短的二进制进行编码,构建最优二叉树。
713 0
《Java安全编码标准》一1.5 拒绝服务
本节书摘来自华章出版社《Java安全编码标准》一书中的第1章,第1.5节,作者 (美)Fred Long,Dhruv Mohindra,Robert C. Seacord,Dean F. Sutherland,David Svoboda,更多章节内容可以访问云栖社区“华章计算机”公众号查看
999 0
java编码转换的详细过程
 常见的JAVA程序包括以下类别:*直接在console上运行的类(包括可视化界面的类)*JSP代码类(注:JSP是Servlets类的变型)*Servelets类*EJB类*其它不可以直接运行的支持类 这些类文件中,都有可能含有中文字符串,并且常用前三类JAVA程序和用户直接交互,用于输出和输入字符,如:在JSP和Servlet中得到客户端送来的字符,这些字符也包括中文字符。
1029 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载