Java:URL签名算法

来自WHY42

在设计一个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);
}