最初的自定义简单数据防篡改

由于公司要求接口安全升级,从自定义防篡改数据MD5加密验证,到使用RSA加密。

原始的MD5防数据篡改的方式:

将所有参数拼接起来,然后在某一字节后加入自定义的字串(混淆码),然后进行MD5加密生成一个str_md5_client值,客户端将加密后的str_md5_client作为一个参数传给后台,后台将其他参数也进行相同的方式拼接混淆加密,生成str_md5_service,将str_md5_client和str_md5_service进行equals比较。true时进行业务操作,false时数据被篡改。

    /**
     * 生成混淆码 参数拼接,在第二字节加入混淆码,进行MD5加密(可在加密后再加入字节排序)
     * 
     * @author zhaofh 2016-07-06
     * 
     * @param 参数数组
     * @return str_md5
     */
    public static String getAppKey(Object[] args) {
        try {
            StringBuffer sb = new StringBuffer();
            String Key = "123456";// 混淆码
            String str = "";
            if (args.length <= 0) {
                sb.append(Key);
                str = sb.toString();
                System.out.println(str);
            } else {
                for (int i = 0; i < args.length; i++) {
                    sb.append(String.valueOf(args[i]));
                }
                str = sb.toString();
                if (str.length() <= 2) {// 第二个字节后加入混淆码
                    str = str + Key;
                } else {
                    str = str.substring(0, 2) + Key + str.substring(2);
                }
            }
            System.out.println(str);
            String md5Key = Encryption.Md5(URLEncoder.encode(str, "UTF-8")
                    .replace("+", "%20"), 32);// 兼容IOS将中文做转码
            System.out.println(md5Key);
            return md5Key;
        } catch (UnsupportedEncodingException e) {
            AppLogger.loggerError(e);
        }
        return "";
    }

MD5方法

      /**
     *MD5加密 
     * @author zhaofh 2016-07-06
     * 
     * @param plainText 明文
         * @param length 加密长度 16  、32
     * @return str_md5
     */
    public static String Md5(String plainText,int length ) { 
        String result = "";
        Logger logger = Logger.getLogger(Encryption.class);
        try { 
            MessageDigest md = MessageDigest.getInstance("MD5"); 
            md.update(plainText.getBytes()); 
            byte b[] = md.digest(); 
            int i; 
            StringBuffer buf = new StringBuffer(""); 
            for (int offset = 0; offset < b.length; offset++) { 
            i = b[offset]; 
            if(i<0) i+= 256; 
            if(i<16) 
            buf.append("0"); 
            buf.append(Integer.toHexString(i)); 
            } 
            if(length==32) {
                //32位加密
                result = buf.toString();
            }else if(length==16) {
                //16位加密
                result = buf.toString().substring(8, 24);
            }else {
                return "";
            }
        } catch (NoSuchAlgorithmException e) { 
            AppLogger.loggerError(e);
        } 
        return result;
    } 

你可能感兴趣的:(最初的自定义简单数据防篡改)