接口验签

一。般使用的签名算法

  1. 将所有参数(sign除外)按照参数名的字母顺序排序,并用&连接: app_id=1235123121&app_poi_code=31×tamp=1389751221
  2. 按照请求url + ? + 排序后的参数 + secretKey的顺序进行连接,得到加密前的字符串: http:/test.com/api/v1/poi/mget?app_id=1235123121&app_poi_codes=31×tamp=1389751221d31ba58fd73c71db697ab5e4946d52d
  3. 对加密前的字符串进行MD5加密,得到签名:00934d00d0aea6f12161edfb6456143d
  4. 将得到的签名赋给sign作为请求参数:http://test.com/api/v1/poi/mget?app_poi_codes=31&app_id=1235123121& timestamp=1389751221&sign=00934d00d0aea6f12161edfb6456143d

二。验签,使用签名算法计算出sign,然后和调用方传过来的比对,不一样就是验签失败,非法请求

三。签名代码

private static final String SIGN = "sig";

private static final String MD5 = "MD5";

private static final String CHARSET_NAME = "utf-8";

/**
 *
 * @param:  * @param baseUrl
 * @return: java.lang.String
 * @throws: ApiSysException
 */
public static String genSig(String url,Map<string, object> params,String secret,boolean isDecode) {

    String baseUrl = appendUrlAndParamsAndSecret(url, params, secret);
    if (isDecode){
        try {
            baseUrl = URLDecoder.decode(baseUrl, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    return DigestUtils.md5DigestAsHex(baseUrl.getBytes());

}
/**
 * &#x6392;&#x5E8F;&#x53C2;&#x6570;&#x5217;&#x8868;
 * @param params
 * @return
 */
private static String sortParams(Map<string, object> params) {
    // &#x81EA;&#x7136;&#x6392;&#x5E8F;
    Set<string> sortedParams = new TreeSet<string>();
    sortedParams.addAll(params.keySet());

    StringBuilder strB = new StringBuilder();
    // &#x6392;&#x9664;sign&#x548C;&#x7A7A;&#x503C;&#x53C2;&#x6570;
    for (String key : sortedParams) {
        if (key.equalsIgnoreCase(SIGN)) {
            continue;
        }
        if (params.get(key) == null){
           continue;
        }
        String value = params.get(key).toString();
        if (value != null) {
            strB.append(key)
                    .append("=")
                    .append(value)
                    .append("&");
        }
    }
    String str = strB.toString();
    if (!StringUtils.isEmpty(str)) {
        str = str.substring(0, str.length() - 1);
    }

    return str;
}

private static String appendUrlAndParamsAndSecret(String url, Map<string, object> params, String secret) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(url)
            .append("?")
            .append(sortParams(params))
            .append(secret);
    return stringBuilder.toString();
}</string,></string></string></string,></string,>

Original: https://www.cnblogs.com/jack1990/p/15319918.html
Author: qiushui
Title: 接口验签

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/565391/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球