博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java编码准则】の #11不要使用Object.equals()来比較密钥值
阅读量:7283 次
发布时间:2019-06-30

本文共 1135 字,大约阅读时间需要 3 分钟。

     java.lang.Object.equals()函数默认情况下是不能用来比較组合对象的,比如密钥值。非常多Key类没有覆写equals()函数,因此,组合对象的比較必须单独比較里面的各个类型以保证正确性。

[不符合安全要求的代码演示样例]

     以下的代码使用equals()函数比較两个key值,key值即使具有同样的取值也可能会返回不相等,导致结果出错。

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

[符合安全要求的解决方式]

     本方案使用equals()方法作为第一个推断依据,假设不相等,则继续比較两个key值的编码版本号,假设还不相等,则进一步比較RSAPrivateKey和RSAPrivateCrtKey是否表示同一个私钥,是的话也返回相等。

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 RSAPrivateCrtKey are equal		if ((key1 instanceof RSAPrivateKey) && (key2 instanceof RSAPrivateCrtKey)) {			if ( ((RSAKey)key1).getModulus().equals( ((RSAKey)key2).getModulus() ) &&				((RSAPrivateKey)key1).getPrivateExponent().equals( ((RSAPrivateKey)key2).getPrivateExponent() ) ) {				return true;			}		}		return false;	}

     总之,单纯使用Object.equals()函数比較两个密钥值是否相等, 仅仅会产生不可预知的结果。

——欢迎转载,请注明出处  ,未经本人允许请勿用于商业用途,谢谢——

你可能感兴趣的文章
容器监控实践—Prometheus的配置与服务发现
查看>>
dubbo源码解析(三十九)集群——merger
查看>>
PAT A1022
查看>>
捋一捋React的生命周期
查看>>
【跃迁之路】【731天】程序员高效学习方法论探索系列(实验阶段488-2019.2.21)...
查看>>
HTTP中Accept与Content-Type区别
查看>>
RunC容器逃逸漏洞席卷业界,网易云如何做到实力修复?
查看>>
PAT A1043
查看>>
SAP S/4HANA生产订单的BAdI增强点之Initialize方法
查看>>
css加载会造成阻塞吗
查看>>
天天都在使用CSS,那么CSS的原理是什么呢?
查看>>
可视化开发脚手架
查看>>
springboot jar 启动脚本
查看>>
现代JS中的流程控制:详解Callbacks 、Promises 、Async/Await
查看>>
如何在微软Azure上设置以太坊私有区块链
查看>>
Docker 文档(目录)
查看>>
你不知道的Virtual DOM(四):key的作用
查看>>
吴恩达机器学习笔记-神经网络的代价函数和反向传播算法
查看>>
前后端的分离模式
查看>>
Yii2开发技巧 使用类似闭包的方式封装事务
查看>>