参数排序HmacSHA1加密算法

最近涉及到了参数排序HmacSHA1算法加密相关知识点,以下为相关算法记录。
主要用于:接口请求保证数据一致性,防中途被串改。


相关算法

参数排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 参数排序
* @param map 参数
* @return 参数排序之后uri
*/
public static String mapToString(Map<String, Object> map) {
if (map == null) {
return null;
}
List<String> keyList = new ArrayList<>(map.keySet());
Collections.sort(keyList);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < keyList.size(); i++) {
String key = keyList.get(i);
Object value = map.get(key);
sb.append(key + "=" + value + "&");
}
String signStr = sb.substring(0, sb.length() - 1);
return signStr;
}

加密算法

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
/**
* HmacSHA1等加密算法
* @param msg 加密的数据
* @param keyString 加密的密钥
* @param algo 加密算法名
* @return 加密之后的数据
*/
public static String hmacDigest(String msg, String keyString, String algo) {
String digest = null;
try {
SecretKeySpec key = new SecretKeySpec((keyString).getBytes("UTF-8"), algo);
Mac mac = Mac.getInstance(algo);
mac.init(key);

byte[] bytes = mac.doFinal(msg.getBytes("ASCII"));

StringBuffer hash = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
hash.append('0');
}
hash.append(hex);
}
digest = hash.toString().toLowerCase();
} catch (UnsupportedEncodingException e) {
} catch (InvalidKeyException e) {
} catch (NoSuchAlgorithmException e) {
}
return digest;
}

相关测试

1
2
3
4
5
6
7
String SECRET_KEY = "23daaAQd5E3A";
Map<String,Object> map = new HashMap<>();
map.put("ZK","ZKValues");
map.put("AK","AKValues");
map.put("XK","XKValues");
String valueseKeyToString = mapToString(map);
String sign = hmacDigest(valueseKeyToString, SECRET_KEY, "HmacSHA1");