Java生成MD5的坑

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{

// 生成一个MD5加密计算摘要_

MessageDigest md = MessageDigest.getInstance("MD5");

// 计算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{

// 生成一个MD5加密计算摘要

MessageDigest md = MessageDigest.getInstance("MD5");

// 计算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将字节一个个的转为十六进制的形式即可!