参数传递机制之JWT

1. 什么是 JWT

JWT 其全称为:JSON Web Token,简单地说就是 JSON 在 Web 上的一种带签名的标记形式。官方的定义如下:

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

即:JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。

2. 有什么作用

对信息进行签名之后再进行传输有什么作用,JWT 就有什么作用。它能起的作用,决定了在项目的需求中是否有必要使用它,它自身的本质决定了它适合的场景。

本质上,JWT 跟自己对信息加个签名没有区别。

那使用它的理由是什么呢?

(1)它建立了一个标准并为多数人认识和接受,这样一来就可以形成标准库,使用者可以共享。

(2)它形成了一些最佳实践,这种实践过程包括了参数安全传递的诸多常见方面,如 exp 到期时间属性的定义来规定签名有效期等。按照最佳实践中对一些 JSON 属性的明确定义,再加上标准库对它的贯彻实现,会带来很多便利。

(3)将其作为 Token 放在请求的 header 中,作为无状态的鉴权方式很适合目前多站点应用的场景。

但最佳实践和其特性不能混为一谈,具体到应用场景,仍然可以利用其特性作适合该场景的其它发挥。

3. 参数访问控制演化

(1)直接传参

http://*/api?p1=*&p2=*

这种方式,不进行访问的权限的判断,公开可直接访问。

(2)带KEY传参

http://*/api?p1=*&p2=*&key=

这种方式需要知道正确的 KEY 才能访问,但 KEY 明文附在后面易泄露。

(3)带签名传参

这种方式,将 KEY 作为签名算法的加密条件,不明文显示,不知道 KEY 则无法生成相应的签名,感觉不错。不足在于,签名一次之后访问链接一直为有效会带有风险。

http://*/api?p1=*&p2=*&sign=

其中签名部分,如采用 md5 方式,key 作为运算的一部分。

sign=md5(p1+p2+key)

(4)带时间戳签名

参数中带上签名时的时间戳,时间戳会参与签名算法,服务端不仅检测签名的有效性,还会比较时间是否在合理范围内,如 5 分钟以内,如此一来,链接在一段时间之后就会失效。

http://*/api?p1=*&p2=*&timestamp=*&sign=

其中签名部分,如采用 md5 方式,time,key 均作为运算的一部分。

sign=md5(p1+p2+time+key)

(5)独立鉴权参数签名

将鉴权部分独立出来签名,这样的好处就是鉴权部分独立的判断过程,其它形参不再需要参与这个签名与判断过程。

参数可使用 JSON 形式,于是可以让其变成以下形式:

鉴权传输部分形式如:{p1:abcd,p2:abcd}.sign

其中,签名部分,如采用 md5 方式,将 JSON 字符串与 key 拼接运算,并且使用连接符.点,如下。

sign=md5({p1:abcd,p2:abcd}.key)

(6)带头部的独立鉴权部分

为了更加灵活的,将鉴权部分加个头部。头部用来干什么呢,可以指定签名算法,或以后可能要更多扩展参数用,如以下形式。

{alg:MD5}.{p1:abcd,p2:abcd}.sign

签名部分,为前两部分再连接上 key 一起运算。

sign=md5({alg:MD5}.{p1:,p2:}.key)

(7)最终标准化为 JWT 形式

头部称之为 header,数据部分称之为 payload,签名部分为 signature。

(7.1) header 不使用明文,采用其 base64 形式

(7.2) payload 不使用明文,采用其 base64 形式

(7.3) signature 为前两者(都是 base64 形式)通过 . 点连接,再采用 header 中指定的签名算法签名的结果。

(7.4) 最终形式为 base64(header).base64(payload).signature

(7.5) base64 考虑到URL编码,将=去掉,+号变成-,/变成_ 处理。

(7.6) 最终字符串通过作为请求 header 进行传输。

4. 最简实现

给定一个签名用的 sercretKey 和 payload,生成成符合要求的 JWT 字符串。多数时候,需求可能就是这样简单,至于签名算法,这里就使用一般默认的HS256。则需要的功能函数大致是:

func getJwt (payload){    var content = base64({"alg":"HS256","typ":"JWT"}) + . + base64(payload)    var signature = base46( sign(content, sercretKey)  )    return content + . + sign}

C# 的实例代码,这里给出一个 C# 的 JWT 辅助类,其中 JObject 引用了 Newtonsoft.Json 包。

    public class JWTHelper    {        #region 工具函数准备        public static string Base64URL(string str)        {            return Convert.ToBase64String(Encoding.UTF8.GetBytes(str)).Replace("=", "").Replace("+", "-").Replace("/", "_");        }                public static string Base64URL(byte[] bs)        {            return Convert.ToBase64String(bs).Replace("=", "").Replace("+", "-").Replace("/", "_");        }        public static string HS256(string str, string key)        {            var encoding = new System.Text.UTF8Encoding();            byte[] keyByte = encoding.GetBytes(key);            byte[] messageBytes = encoding.GetBytes(str);            using (var hmacsha256 = new HMACSHA256(keyByte))            {                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);                return Base64URL(hashmessage);            }        }        #endregion                public static string Sign(JObject payload, String key)        {            JObject header = new JObject();            header["alg"] = "HS256";            header["typ"] = "JWT";            string h = Base64URL(header.ToString(Formatting.None));            string p = Base64URL(payload.ToString(Formatting.None));            string s = HS256(h + "." + p, key);            return String.Format("{0}.{1}.{2}", h, p, s);        }    }

使用以下代码测试一下:

JObject payload = new JObject();payload["username"] = "xxx";Console.Write(JWTHelper.Sign(payload, "123fd"));

得到结果

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Inh4eCJ9.1C28A5CqMa70FLtUQh4pwSZWPlZhbQ-ZeYs38K_sqks

在 https://jwt.io/ 上,可以验证一下,得到了同样的结果。

640?wx_fmt=png

5. 具体使用

显然,它也会存在一些问题,如通过 base64 解码看到明文,或者是在有效期内取得整个 token 进行访问等。所以使用是根据需要来的。而且,也可以在 JWT 上进一步加入自定义的新机制来应对更多的场景。

以下这篇文章列出了一些问题与趋势,可供参考。

https://baijiahao.baidu.com/s?id=1608021814182894637

更多细节可参考:https://www.cnblogs.com/cjsblog/p/9277677.html


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NOI2009】诗人小G【决策单调性dp】

传送门 设句子加上空格长度前缀和为sss 转移方程为 fimin⁡1≤j<i{fj∣si−sj−L−1∣P}f_i\min_{1\leq j<i}\{f_j|s_i-s_j-L-1|^P\}fi​1≤j<imin​{fj​∣si​−sj​−L−1∣P} 不难发&#xff08;cai&#xff09;现&#xff08;chu&#xff09;决策具有单调性 …

Codeforces Round #709 (Div. 1) B. Playlist 链表维护 + bfs

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 紧跟刘爷脚步补题。 不难想到用链表维护下一个数是什么&#xff0c;这样就跟以前做过的一个题差不多了&#xff0c;首先将初始的时候删掉的点的前一个点即为题目中的AAA入队&#xff0c;让…

浅谈ASP.NET Core中IOC与DI的理解和使用

说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生&#xff0c;早前&#xff0c;自己也有尝试过去了解这两个东西&#xff0c;但是一直觉得有点很难去理解&#xff0c;总觉得对其还是模糊不清&#xff0c;所以&#xff0c;趁着今天有空&#xff0c;就去把两个概念捋清…

Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树

传送门 文章目录题意&#xff1a;思路题意&#xff1a; 给你一张nnn个点mmm个边的图&#xff0c;mmm条边是给定的&#xff0c;要求你给未给定的边赋值一个边权&#xff0c;使得所有边权异或和为000&#xff0c;求所有满足这种情况的图中最小生成树边权和最小的&#xff0c;输出…

一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE

这是一个.net下操作数据库(结构数据库)的工具类&#xff0c;支持sqlserver、oracle、mysql、postgres、sqlite、access等常见数据库。注意&#xff1a;它并不是一个orm工具(常见的orm框架如&#xff1a;EF、Dapper等)。2.1 引入DBUtil依赖1. 首先打开vs(推荐vs2019)&#xff0c…

【NOI2012】迷失游乐园【概率期望】【换根dp】【基环树】

传送门 题意&#xff1a;给一棵nnn个点的带边权树或基环树&#xff0c;随机选一个点作为起点&#xff0c;每次随机走到一个相邻未走过的位置&#xff0c;直到无路可走。求期望路径长度。 n≤105n \leq 10^5n≤105,为基环树时环的大小不超过202020 先考虑树怎么做废话 先只考…

Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components? 暴力 + 补图的遍历

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5。 思路&#xff1a; 这是题是我上个题的一部分&#xff0c;算是个小知识点&#xff0c;暴力能过。 直接维护一个setsetset&#xff0c;让后遍历所有点&#xff…

初探System.Threading.Channels

。System.Threading.Channels是.Net Core基础类库中实现的一个多线程相关的库&#xff0c;专门处理数据流相关的操作&#xff0c;用来在生产者和订阅者之间传递数据&#xff08;不知道可不可以理解为线程间传递数据&#xff0c;我把它类比成了Go语言中的Channel&#xff09;&am…

【LOJ6033】棋盘游戏【二分图博弈】

传送门 显然是个二分图&#xff0c;设开始位置是左边&#xff0c;另一边是右边 那么先手是把左边挪到右边&#xff0c;后手是把右边挪到左边&#xff0c;不能挪的那方失败 结论&#xff1a;Alice必胜当且仅当开始位置不一定在最大匹配上 必要性&#xff1a; 如果开始位置不…

Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 找规律yydsyydsyyds。 一看没什么想法&#xff0c;所以打了个表&#xff0c;好家伙&#xff0c;不打不知道&#xff0c;一打不得了&#xff0c;下面是n6n6n6的符合要求的情况&#xff1a; …

SQL Server之索引解析(二)

、堆表堆表通过IAM连接一起&#xff0c;查询时全表扫描。1、1 非聚集索引结构叶子节点数据结构&#xff1a;行数据结构Rid&#xff08;8字节&#xff09;中间节点数据结构&#xff1a; &#xff08;非聚集非唯一索引&#xff09;行数据结构Page&#xff08;4&#xff09;2 Rid&…

【NOI2011】兔兔与蛋蛋的游戏【二分图博弈】

传送门 结论 不会有同一个棋子移动两次 反证法&#xff0c;对于第一个移动第二次的棋子 设两次移动之间(含)的移动的棋子为A1,A2,A3,……&#xff0c;AnA_1,A_2,A_3,……&#xff0c;A_nA1​,A2​,A3​,……&#xff0c;An​&#xff08;指棋子本身而非位置&#xff09; 因…

CF1528C dfs序+set维护

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两棵有nnn个节点的树&#xff0c;我门记第一棵为aaa&#xff0c;第二棵为bbb&#xff0c;现在你有一个nnn个点都孤立的点集&#xff0c;两个点u,vu,vu,v可以连边当且仅当这两个点在aaa树中一个是另一个的…

纠正一个错误,分布式系统关注点第17篇

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「78」篇原创敬上今天来加个餐&#xff0c;紧急纠正一个错误。先和大家说一声抱歉&#xff1a;D昨晚睡觉前&#xff0c;惯例打开「订阅号助手」回复一些留言。有一位小伙伴提了…

【NOI2016】国王饮水记【贪心】【斜率优化】【决策单调性】

传送门 首先比h1h_1h1​小的肯定没用&#xff0c;直接无视 然后考虑合并的顺序 ①在无限制的情况下&#xff0c;合并多个不如一个一个合并 a<b<ca<b<ca<b<c时&#xff0c;ab2c2>abc3{{ab \over 2}c\over 2}>{{abc}\over 3}22ab​c​>3abc​ ②先…

CF946D Timetable 背包dp + 思维转换

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n,m,k≤500n,m,k\le500n,m,k≤500 思路&#xff1a; 将其转换成背包的模型&#xff0c;就可以想出来一个很明显的dpdpdp状态&#xff1a;f[i][j]f[i][j]f[i][j]表示前iii行花费了jjj的最小代价&#xff0c;…

.NET开发框架(三)-高可用服务器端设计

我们对框架功能作了简述&#xff0c;演示视频请点击 这里查看 &#xff0c;本章节&#xff0c;我们专门讲解一下&#xff0c;如何在Window服务器下&#xff0c;设计高可用的框架。我们的框架设计采用的是Window版本的服务端设计&#xff1a;整体框架图如下&#xff0c;为什么我…

P1537 弹珠 背包可行性dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 疯狂水文章。 这个很明显是个背包&#xff0c;我们开一个布尔数组&#xff0c;之后枚举每组的个数&#xff0c;让后枚举1−61-61−6&#xff0c;再枚举容量kkk&#xff0c;注意顺序不能错了…

【NOI2012】骑行川藏【拉格朗日乘数法】【二分套二分】

传送门 拉格朗日乘数法裸题 限制 f({v})∑i1nkisi(vi−vi′)EUf(\{v\})\sum_{i1}^nk_is_i(v_i-v_i)E_Uf({v})i1∑n​ki​si​(vi​−vi′​)EU​ 求 g({v})∑i1nsivig(\{v\})\sum_{i1}^n\frac{s_i}{v_i}g({v})i1∑n​vi​si​​ 最小值 设 L(λ,{v})g({v})λ[f({v})−EU]∑…

.NET Core 3.0中的WinForms创建集中式拉取请求中心

Windows 窗体&#xff08;或简称 WinForms&#xff09;&#xff0c;多年来被用于开发具有丰富和交互式界面的基于 Windows 的强大应用程序。各类企业对这些桌面应用程序的投入量非常巨大&#xff0c;每月有大约 240 万开发人员使用 Visual Studio 创建桌面式应用。利用和扩展现…