《Java编码指南:编写安全可靠程序的75条建议》—— 指南11:不要使用Object.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()比较密钥可能会产生意想不到的结果。
【Java|多线程与高并发】 使用Thread 类创建线程的5种方法&&如何查看程序中的线程 多线程编程主要是为了更好地解决并发编程这个问题,因为创建销毁调度一个进程开销比较大(消耗资源多和速度慢),进程之所以开销比较大,主要是在 资源的分配和回收上 而线程也被称为 轻量级进程 ,因此在解决并发编程这个问题上,线程的创建销毁调度的更快一些.
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- [Java 基础] 使用java.util.zip包压缩和解压缩文件
- java进程的守护进程脚本
- JAVA 注解教程(四)Java 预置的注解
- JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)
- Java实现 LeetCode 820 单词的压缩编码(暴力)
- Java实现 LeetCode 212 单词搜索 II(二)
- Java实现 LeetCode 212 单词搜索 II
- java实现多线程(车站卖票)
- Java实现 蓝桥杯VIP 算法训练 连接字符串
- Java实现 蓝桥杯VIP 算法训练 阿尔法乘积
- Java实现 蓝桥杯 算法提高 复数四则运算
- Java中如何输出对勾,ASCII编码与字符串相互转换
- (转载)java多态(2)-------Java转型(向上或向下转型)
- 【JAVA】Java循环语句中的continue跳转进入下一次循环是否判断循环条件
- JAVA数据结构--队列及优先队伍
- 【JAVA】Java 异常中e的getMessage()和toString()方法的异同
- 【JAVA】java中的length和length()
- 【JAVA】java编译错误:编码UTF8/GBK的不可映射字符
- paip.java UrlRewrite 的原理and实现 htaccess正则表达式转换
- How to improve Java's I/O performance( 提升 java i/o 性能)
- Java扑克牌(斗地主,手中牌的排序)【Comparator】
- JAVA编程:java环境安装和helloworld
- 解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题
- JAVA运行java程序
- Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释
- java的this关键字理解
- 【java】Java 抽象类
- Java核心类库之(字符集/编码集、File类、递归、IO流:字节流、字符流、特殊操作流)