zoukankan      html  css  js  c++  java
  • JWT加密解密

    如何保证WebAPI的安全?
    1、JWT加密解密。token
    2、使用https传输协议。
    3、把用户所有请求的参数信息加上一个只有服务器端知道的secret,做个散列运算,然后到了服务器端,服务器端也做一个散列运算。如果散列值是一样的,那就表示没被篡改。
    4、在业务逻辑上进行保护。(检查访问者是否有权限来实现一些操作。这点是最主要的,前面3的未必能够100%保证安全)


    JWT由三部分组成(Header,Payload,Signature),可以把用户名、角色等无关紧要的信息保存到Payload部分。

    Header:base64enc({ "alg":"HS256","TYPE":"JWT"})  // eyAiYWxnIjoiSFMyNTYiLCJUWVBFIjoiSldUIn0=

    Payload:base64enc({"user":"vichin","pwd":"weichen123"})  //用户的关键信息 eyJ1c2VyIjoidmljaGluIiwicHdkIjoid2VpY2hlbjEyMyJ9

    Signature:HMACSHA256(base64enc(header)+","+base64enc(payload),secretKey)

    Header和Payload部分使用的是Base64编码,几乎等于明文,Signature部分是根据header+payload+secretKey进行加密算出来的,如果Payload被篡改,就可以根据Signature解密时候校验。

    首先需要添加引用

    install-package JWT (3.0.1支持 .net framework 3.5,3.0.2需要.net 4.6.2)。

            public void AddSecret()
            {
                double exp = (DateTime.UtcNow.AddSeconds(10) - new DateTime(1970, 1, 1)).TotalSeconds;//10秒过期
                var payload = new Dictionary<string, object>
                {
                    {"UserID",123},
                    {"UserName","admin"},
                    { "exp",exp}//过期时间的key必须叫exp
                };
                string secret = "123456789";//不能泄露的key
                IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
                IJsonSerializer serialer = new JsonNetSerializer();
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtEncoder encoder = new JwtEncoder(algorithm, serialer, urlEncoder);
                string token = encoder.Encode(payload, secret);
                textBox1.Text = token;
            }
            public void SubSecret(string token)
            {
                //string token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySUQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.OR0lZOfbQr7D2wnY_m44tX9DOoNmDWV-6X53_ZZGJAs";
                var secret = "123456789"; //不能泄露的key
                try
                {
                    IJsonSerializer serializer = new JsonNetSerializer();
                    IDateTimeProvider provider = new UtcDateTimeProvider();
                    IJwtValidator validator = new JwtValidator(serializer, provider);
                    IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                    IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
                    var json = decoder.Decode(token, secret, verify: true);                
                }
                catch (TokenExpiredException)
                {
                    MessageBox.Show("Token has expired");
                }
                catch (SignatureVerificationException)
                {
                    MessageBox.Show("签名验证失败,数据可能被篡改");
                }
            }
  • 相关阅读:
    java lambda表达式学习笔记
    一个奇妙的java坑:Long 类型的比较
    要不要冗余字段
    mysql找回密码
    mysql创建触发器
    【转】Java 8十个lambda表达式案例
    ThreadLocal类学习笔记
    mybatis generator使用总结
    【转】Java 项目UML反向工程转化工具
    PostMan做接口自动化测试
  • 原文地址:https://www.cnblogs.com/vichin/p/11928688.html
Copyright © 2011-2022 走看看