0%

支付加密中的字典序排序(ASCII码排序)以及MD5 SHA256加密 -JAVA

在做业务开发,特别是支付相关的业务时,可能会碰到需要将入参按照字典序排序后再MD5或者SHA256加密的问题。 例如: Screenshot 2020-03-23 at 10.53.54 PM.png

那么如何用JAVA来快速实现呢?

其实很简单,简单到只需要一行代码

1
Collections.sort(keys);

一般来讲我们会用map来存储所有的参数,所以整体的实现就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
*
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, String> params) {
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}

附上MD5的Java实现

1
2
3
4
public static String sign(String text, String key, String input_charset) {
text = text + "&key=" + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
}

SHA256的Java实现

1
2
3
4
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
sha256_HMAC.init(new SecretKeySpec(WechatConfig.key.getBytes(), "HmacSHA256"));
byte[] result = sha256_HMAC.doFinal(prestr.getBytes());
String sign = DatatypeConverter.printHexBinary(result).toUpperCase();