Java:URL签名算法
在设计一个REST风格的API的时候,参考现有的一些资料,设计了一个签名算法:
${API_URL}/${VERSION}/[URL签名部分]&sign=${SIGNATURE}
签名的过程为:
- 对客户端秘钥进行SHA512哈希算法,生成哈希值字符串。
- 将URL签名部分的参数按照字典序升序排列并拼接到一起,再与上一步生成的哈希值拼接,生成一个新字符串
- 对第2步生成的字符串求SHA1值作为签名字符串
public static String sign(List<String> params, String secretHash){
// 对参数列表进行字典排序
Collections.sort(params);
String src = "";
for(String str:params)
src += str;
// 附加应用秘钥哈希值
src += secretHash;
return sha1(src);
}
public static String signUrl(String url, String secretHash){
if(url == null || !url.contains("?"))
throw new IllegalArgumentException("Trouble spliting url:" + url);
String params = url.split("\\?")[1];
List<String> paramList = new ArrayList<String>();
for(String pair:params.split("\\&"))
paramList.add(pair);
return url + "&sign=" + sign(paramList, secretHash);
}