Java对方法参数进行签名加密

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Java对方法参数进行签名加密,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

参数签名步骤

1.将请求参数中除 sign 外的多个键值对,按一定规则排序,拼成一个字符串

2.将 signKey 拼接在 第一步 中排序后的字符串前/后面得到待签名字符串

3.使用算法加密待加密字符串,得到sign

4.将 sign 添加到请求参数中

MD5加密算法

public final class MD5 {
    public static String encrypt(String strSrc) {
        try {
            char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
                    '9', 'a', 'b', 'c', 'd', 'e', 'f'};
            byte[] bytes = strSrc.getBytes();
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(bytes);
            bytes = md.digest();
            int j = bytes.length;
            char[] chars = new char[j * 2];
            int k = 0;
            for (byte b : bytes) {
                chars[k++] = hexChars[b >>> 4 & 0xf];
                chars[k++] = hexChars[b & 0xf];
            }
            return new String(chars);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException("MD5加密出错: " + e);
        }
    }

    public static String encrypt2(String strSrc) {

        try {
            MessageDigest digest = MessageDigest.getInstance("md5");
            byte[] result = digest.digest(strSrc.getBytes());

            StringBuffer buffer = new StringBuffer();
            for (byte b : result) {
                int number = b & 0xff;
                String str = Integer.toHexString(number);
                if (str.length() == 1) {
                    buffer.append("0");
                }
                buffer.append(str);
            }
            return buffer.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            throw new RuntimeException("MD5加密出错: " + e);
        }
    }
}

Signature签名工具类

@Slf4j
public class Signature {
    /**
     * 请求参数转Map
     *
     * @param paramMap
     * @return
     */
    public static Map<String, Object> switchMap(Map<String, String[]> paramMap) {
        Map<String, Object> resultMap = new HashMap<>();
        for (Map.Entry<String, String[]> param : paramMap.entrySet()) {
            resultMap.put(param.getKey(), param.getValue()[0]);
        }
        return resultMap;
    }

    /**
     * 请求数据获取签名
     *
     * @param paramMap 请求参数
     * @param signKey  签名Key
     * @return
     */
    public static String getSign(Map<String, Object> paramMap, String signKey) {
        paramMap.remove("sign");

        TreeMap<String, Object> sorted = new TreeMap<>(paramMap);
        StringBuilder str = new StringBuilder();
        for (Map.Entry<String, Object> param : sorted.entrySet()) {
            str.append(param.getValue()).append("|");
        }
        str.append(signKey);
        log.info("加密前:" + str.toString());
        String md5Str = MD5.encrypt(str.toString());
        log.info("加密后:" + md5Str);
        return md5Str;
    }

    /**
     * 签名校验
     *
     * @param paramMap 请求参数
     * @param signKey  签名Key
     * @return
     */
    public static boolean isSignEquals(Map<String, Object> paramMap, String signKey) {
        String sign = (String) paramMap.get("sign");
        String md5Str = getSign(paramMap, signKey);
        return sign.equals(md5Str);
    }

    /**
     * 获取时间戳
     *
     * @return
     */
    public static long getTimestamp() {
        return System.currentTimeMillis();
    }
}

代码示例

@RestController
public class TestController {

    private static final String SIGNKEY = "HelloWorld";

    /**
     * 使用加密算法加密字符串得到sign
     *
     * @return
     */
    @GetMapping("/getSign")
    public String getSign() {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("userName", "小白");
        paramMap.put("age", "20");
        return Signature.getSign(paramMap, SIGNKEY);
    }

    /**
     * 参数携带sign请求进行参数验证
     *
     * @param request
     * @return
     */
    @GetMapping("/verifySignature")
    public Object verifySignature(HttpServletRequest request) {
        // 参数转换成Map
        Map<String, Object> paramMap = Signature.switchMap(request.getParameterMap());

        // 进行参数签名验证
        if (!Signature.isSignEquals(paramMap, SIGNKEY)) {
            throw new RuntimeException("签名校验失败....");
        }
        return "success";
    }
}

执行测试

请求 http://localhost:8888/getSign生成Sign

c8dfaf36ad2a96d89e53c7e745d4db7f

请求http://localhost:8888/test?userName=小白&age=20&sign=c8dfaf36ad2a96d89e53c7e745d4db7f进行方法参数校验

success

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136997.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!