AKSK团队呼吁加强数据加密保护措施
最编程
2024-07-27 16:37:06
...
1.组成部分
url = 原请求参数+ 时间戳 + UUID + 签名
1).原请求参数:可包含账号、类型、接口、接口参数等参数(原请求参数可能包含密码等敏感信息,后续生成签名后可删除)
2).时间戳:ms级请求时间
3).UUID:随机数
4).签名:原请求参数 + 时间戳 + UUID进行加密并规范
2.流程
1).首先将原请求参数后拼接上时间戳和UUID得到cacheUrl;
2).将拼接好的cacheUrl转换为HashMap,以key-value的形式存放;
3).按照key进行排序,然后拼接得到新的url字符;
4).将新的字符进行加密(如MD5等),然后将加密好的字符转换为大写得到签名;
5).将cacheUrl中的敏感信息(如密码等参数)删除,拼接签名。
3.代码
1).AK/SK请求加密工具类
public class requestEncryptionOfAKSKUtil { /** * 将url地址添加签名(时间戳+随机UUID+sign) * @param url 原请求地址 * @return String 新请求地址 */ public static String getNewUrl(String url) { //拼接时间戳+随机UUID String timestamp = String.valueOf(System.currentTimeMillis()); String nonce = UUID.randomUUID().toString(); url += "×tamp=" + timestamp; url += "&nonce=" + nonce; //获取url中要素,以key-value形式存放,方便下一步操作 HashMap<String, String> signParam = getUrlParams(url); //获取sign值 String sign = getSign(signParam); url += "&sign=" + sign; //删除url参数中的密码 url = removeParam(url, Arrays.asList("pwd")); return url; } /** * 将url参数转换成hashMap * @param param url字符串 * @return url参数(key-value) */ public static HashMap<String, String> getUrlParams(String param) { HashMap<String, String> hashMap = new HashMap<>(); if (StringUtils.isBlank(param)) { return hashMap; } String allParams = param.split("\\?")[1]; String[] params = allParams.split("&"); for (String s : params) { String[] p = s.split("="); if (p.length == 2) { hashMap.put(p[0], p[1]); } } return hashMap; } /** * 将url参数排序并加密生成sign值 * @param signParam url参数(key-value) * @return sign值 */ public static String getSign(HashMap<String, String> signParam) { StringBuilder stringSignTemp = new StringBuilder(); //按key排序 Set<String> set = signParam.keySet(); Object[] arr = set.toArray(); Arrays.sort(arr); String keyVal; for (int i = 0; i < arr.length; i++) { keyVal = (String) arr[i]; if (i != arr.length - 1) { stringSignTemp.append(keyVal).append("=").append(signParam.get(keyVal)).append("&"); } else { stringSignTemp.append(keyVal).append("=").append(signParam.get(keyVal)); } } //将排序拼接的stringSignTemp进行MD5(32位)加密,然后将字符转换为大写 return MD5.encrypt(stringSignTemp.toString()).toUpperCase(); } /** * 去除Url中指定的参数字段 * @param url 需要去参的url * @param name 参数名称 * @return url */ private static String removeParam(String url, List<String> name) { for (String s : name) { // 使用replaceAll正则替换,replace不支持正则 url = url.replaceAll("&?" + s + "=[^&]*", ""); } return url; } }
2).MD5(32位)加密类
public class MD5 {
/** * MD5加密(32位)
* @param text
* @return String
*/
public static String encrypt(String text) {
StringBuffer sb = new StringBuffer("");
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(text.getBytes("UTF-8"));
byte[] result = md.digest();
int i;
for (int offset = 0; offset < result.length; offset++) {
i = result[offset];
if (i < 0) {
i += 256;
}
if (i < 16) {
sb.append("0");
}
sb.append(Integer.toHexString(i));
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
}
推荐阅读