zoukankan      html  css  js  c++  java
  • 接口签名进行key排序,并MD5加密

    import org.apache.commons.codec.digest.DigestUtils;
    import java.io.UnsupportedEncodingException;
    import java.util.Map;
    import java.util.TreeMap;
    /**
     * @Author: rongrong
     * @Date: 2018/4/23
     * @Description:
     */
    public class MD5Utils {
        private static void getDigest(TreeMap<String, String> map, String key, String charset){
            StringBuilder sb = new StringBuilder();
            for (Map.Entry entry : map.entrySet()) {
                sb = sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
            sb.append("key").append("=").append(key);
            System.out.println("拼接后的字符:"+sb.toString());
            String sign = DigestUtils.md5Hex(getContentBytes(sb.toString(), charset));
            System.out.println("加密后的签名:"+sign);
        }
        private static byte[] getContentBytes(String content, String charset) {
            if (charset == null || "".equals(charset)) {
                return content.getBytes();
            }
            try {
                return content.getBytes(charset);
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
            }
        }
        public static void main(String[] args) {
            //treeMap默认是key升序排序 ,如果需要降序,可以使用Comparator中的compare方法
            TreeMap<String,String> map = new TreeMap<String, String>();
            map.put("name", "zychen");
            map.put("password", "123456");
            map.put("project", "base");
            map.put("tenantId", "192319387131");
            getDigest(map, "helloWorld","utf-8");
        }
    }

    简单叙说jwt加密原理以及这样加密方式的优缺点?

    原理:JWT由三部分组成:header.payload.signature,每部分是一个Json表示。最终的Token对这三部分进行编码之后的字符串,中间用“.”分割。header用来描述token的类型(jwt)以及使用的hash算法,payload包含一些摘要信息,signature签名由前面的Header、Payload以及秘钥组成。当访问登录页的时候,登录服务验证之后,签发证书返回给客户端。客户端保存证书,并在每次请求时将其附在request header中。服务器接收请求之后,通过签名和时戳,验证Token的有效性。若有效,则响应客户端。

    优点:无状态,不需要在 session中存储用户信息,不用担心跨域问题,只需在用户验证成功后,获取一个JWT token,服务端验证签名即可,比 cookie 更支持原生移动端应用,验证解耦,无需使用特定的身份验证方案,token可以在任何地方生成
    缺点:
    1.请求地址中的token容易被盗取,难以保证token本身的安全
    2.HTTP 头中自定义属性但是局限性太大,XMLHttpRequest 请求通常用于Ajax方法中对于页面局部的异步刷新,通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便

    摘要认证:
    采用对参数和响应进行摘要的方法,每次请求和响应,按照一定的规则生成数字摘要,客户端和服务端双方需要约定好参数的排序方式,请求的参数经过排序后,再将参数名名称和值经过一定的策略组织起来,加上一个秘钥secret,就是‘盐’通过约定的摘要算法生成数字摘要,传递给服务端。服务端在接收到客户端传递的参数后,服务端会采取和客户端相同的策略对参数进行排序,并且加上相同的secret,采用相同的摘要算法生成摘要串,由于相同内容经过相同的摘要算法,生成的摘要内容必定相同。将服务端生成的摘要串与客户端生成的摘要串进行比较,这样就能知道参数内容是否被篡改。

  • 相关阅读:
    Codeforces Round #627 (Div. 3) 总结
    [IOI1994] 时钟
    收集一些优秀的甲方安全开源项目
    python基础——对时间进行加减
    JSFinder:一个在js文件中提取URL和子域名的脚本
    python对齐输出
    python使用smtplib发送邮件
    任务2:扫描渗透测试(50分)[2019年信息安全管理与评估赛题答案-01]
    记一次Xmrig挖矿木马排查过程
    Bypass xss过滤的测试方法
  • 原文地址:https://www.cnblogs.com/longronglang/p/8918369.html
Copyright © 2011-2022 走看看