錯誤的寫法:
public static String md5(String plainText) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(
plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("沒有md5這個算法!");
}
String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
// 如果生成數字未滿32位,需要前面補0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
----這種寫法會導致 有一定幾率出現31位加密報文,坑的無話可說!這時候只能將json字符串報文中的雙引號 replace 成單引號 成功解決,需要判斷2種情況,雙引號不行再換單引號,不然單引號也會出現31位加密報文,坑啊,說到底還是上面的加密算法有問題。
正確的寫法:
public static String MD5(String sourceStr) {
try {
// 獲得MD5摘要算法的 MessageDigest對象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字節更新摘要
mdInst.update(sourceStr.getBytes());
// 獲得密文
byte[] md = mdInst.digest();
// 把密文轉換成十六進制的字符串形式
StringBuffer buf = new StringBuffer();
for (int i = 0; i < md.length; i++) {
int tmp = md[i];
if (tmp < 0)
tmp += 256;
if (tmp < 16)
buf.append("0");
buf.append(Integer.toHexString(tmp));
}
// return buf.toString().substring(8, 24);// 16位加密
return buf.toString();// 32位加密
} catch (Exception e) {
throw new RuntimeException("沒有md5這個算法!");
}
}
-----這個會在最前面補上一個0,構成32位加密報文