Java生成MD5的坑
Java生成MD5的坑
本来一切都风平浪静,今天接口调用方突然在群里艾特我,说调接口的时候返回鉴权失败。
其中r和t是用来参与加密运算的字符串,然后双方都持有已知的公钥,所以在代码中进行如下的计算:
DataCenterUtils.getMD5(r + t + SECRET_KEY)
得到的结果和sign做比较,一致则验证通过。
问题就出在计算出md5值之后,转化成String类型的过程,之前的哥们是这么转化的:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public static String getMD5(String str) throws Exception{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
return new BigInteger(1, md.digest()).toString(16);
}
|
乍一看没有问题,很多人也是这么做的,但是如果得到的md5结果是以0开头的,那结果就悲剧了,转化为数值类型的时候会将开头的0丢弃,所以造成结果和sign不一致的情况出现!
将代码进行如下修改后,问题解决:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public static String getMD5(String str) throws Exception{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
return toHexString(md.digest());
}
private static String toHexString(byte[] bytes) {
Formatter formatter = new Formatter();
for (byte b : bytes) {
formatter.format("%02x", b);
}
String res = formatter.toString();
formatter.close();
return res;
}
|
利用formatter将字节一个个的转为十六进制的形式即可!