由于公司要求接口安全升级,从自定义防篡改数据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;
}