MD5不同机器生成不同的问题
程序员文章站
2022-06-09 15:01:43
...
问题:本地机器运行没问题,再联调服务器上运行就报错,MD5签名不一致
原始代码:
private static String md5Encode(String text, String charset) throws UnsupportedEncodingException, NoSuchAlgorithmException {
text = new String(text.getBytes(), charset);
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] result = digest.digest(text.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : result) {
int number = b & 0xff;
String hex = Integer.toHexString(number);
if (hex.length() == 1) {
sb.append("0").append(hex);
} else {
sb.append(hex);
}
}
return sb.toString();
}
所有的数据一致,但是怎么执行也不对。后来发现字符集问题,记录一下。
private static String md5Encode(String text, String charset) throws UnsupportedEncodingException, NoSuchAlgorithmException {
text = new String(text.getBytes(charset), charset);
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] result = digest.digest(text.getBytes(charset));
StringBuilder sb = new StringBuilder();
for (byte b : result) {
int number = b & 0xff;
String hex = Integer.toHexString(number);
if (hex.length() == 1) {
sb.append("0").append(hex);
} else {
sb.append(hex);
}
}
return sb.toString();
}
核心问题:
text.getBytes(charset);
原来不同的机器的默认字符集是不一样的,如果默认使用
text.getBytes()不加charset运行不同机器的结果不同。
建议使用apache的算法:
org.apache.commons.codec.digest.DigestUtils.md5Hex(str.getBytes("utf8"))
推荐阅读