【Java编码准则】の #11不要使用Object.equals()来比較密钥值

     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()函数比較两个密钥值是否相等, 仅仅会产生不可预知的结果。


——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人允许请勿用于商业用途,谢谢——

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值