欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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(); 
    } 
}