zoukankan      html  css  js  c++  java
  • 【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 ,未经本人允许请勿用于商业用途,谢谢——

  • 相关阅读:
    Ubuntu+XAMPP+Wordpress的安装与配置问题
    Html5最简单的游戏Demo——Canvas绘图的骰子
    Html5最简单的游戏Demo——Canvas绘图的弹弹球
    LinqToExcel: LINQ查询Excel电子表格
    Asp.Net Web API开发微信后台
    Json.Net使用JSON Schema验证JSON格式【实例】
    Json.Net使用JSON Schema验证JSON格式
    LeetCode-C#实现-哈希表(#349)
    大话设计模式-解释器模式
    大话设计模式-享元模式
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3806778.html
Copyright © 2011-2022 走看看