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

相关文章
|
1天前
|
缓存 算法 Java
如何提高Java程序的性能?
Java是一种非常流行的编程语言,但是在处理大规模数据和高并发时,程序性能容易受到影响。本文将分享一些提高Java程序性能的技巧。
|
6天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
13 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
6天前
|
前端开发 Java 应用服务中间件
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
26 0
|
6天前
|
存储 安全 Java
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
|
6天前
|
Java Linux C语言
一步带你了解java程序逻辑控制
一步带你了解java程序逻辑控制
17 2
|
6天前
|
Java 数据安全/隐私保护
java中程序控制的典例
java中程序控制的典例
13 1
|
6天前
|
存储 Java 数据库连接
使用Java开发桌面应用程序
使用Java开发桌面应用程序
25 0
|
6天前
|
关系型数据库 MySQL Java
通过使用阿里云服务器,搭建Java程序的运行环境
通过使用阿里云服务器,搭建Java程序的运行环境
|
6天前
|
存储 网络协议 Java
本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件
本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件
|
6天前
|
Java Spring
Java 效率编码 必备插件 Lombok 让代码更优雅
该内容是一个关于Lombok插件的教程摘要:介绍了Lombok用于减少Java开发中的模板代码,提升效率;讲解了如何在IntelliJ IDEA中安装Lombok插件,以及在pom.xml中添加依赖;并提到了@Data注解能自动生成getter/setter、equals、hashCode和toString方法,@Slf4j注解自动处理日志,@Builder用于构建对象,以及@AllArgsConstructor和@NoArgsConstructor注解生成构造函数。还鼓励探索更多Lombok的注解用法。