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 ,未经本人同意请勿用于商业用途,谢谢——
【Java编码准则】の #11不要使用Object.equals()来比较密钥值,布布扣,bubuko.com
【Java编码准则】の #11不要使用Object.equals()来比较密钥值
原文:http://blog.csdn.net/asce1885/article/details/33011537