多系统之间鉴权

前言,系统与系统之间的交互安全问题是重要的一环,作者将目前将主流对接方式呈现出来。如图一所示:
图一

Java代码为示例呈现加密方法

1.双方协商约定好的密钥

String Secret =123456 (自定义秘钥)

/**
 * 进行SHA1处理
 *
 * @param str
 * @return
 */
public static String SHA1(String str) {
    char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f'};
    try {
        MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
        mdTemp.update(str.getBytes(StandardCharsets.UTF_8));
        byte[] md = mdTemp.digest();
        int j = md.length;
        char[] buf = new char[j * 2];
        int k = 0;
        for (byte byte0 : md) {
            buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
            buf[k++] = hexDigits[byte0 & 0xf];
        }
        return new String(buf);
    } catch (Exception e) {
        return null;
    }
}

2.进行排序

/**
 * 进行排序
 *
 * @param params 包含appId的参数
 * @return
 */
private static TreeMap sortParamsMap(Map params) {
    return new TreeMap<>(params);
}

3.按照参数进行排序后拼接

/**
 * 按照参数进行排序后拼接
 * 拼接参数:k=v&k=v
 *
 * @param params
 * @return
 */
public static String joiningParams(Map params) {
    if (params == null || params.size() == 0) {
        return null;
    }
    TreeMap sortedMap = sortParamsMap(params);
    StringJoiner joiner = new StringJoiner("&");
    sortedMap.forEach((k, v) -> joiner.add(k + "=" + v));

    return joiner.toString();
}

4.获取签名

    /**
     * 获取签名
     *
     * @param params 请求参数,并且包含,appId
     * @param secret 双方协商约定好的密钥 。举例见 下面的main方法
     * @return
     */
    public static String getSign(Map params, String secret)   {

        //1、获取拼接后的字符串。
        String str = joiningParams(params);
        if (str == null || str.length() == 0) {
            return null;
        }

        //2、获取SHA1
        String sha1 = SHA1(str + secret);
        if (sha1 == null || sha1.length() == 0) {
            return null;
        }

        //3、最终加密
        byte[] encode = Base64.getEncoder().encode(sha1.getBytes());

        return new String(encode);
    }


你可能感兴趣的:(多系统之间鉴权)