IdentityServer4之JWT签名(RSA加密证书)及验签

一、前言


 在IdentityServer4中有两种令牌,一个是JWT和Reference Token,在IDS4中默认用的是JWT,那么这两者有什么区别呢?

 

二、JWT与Reference Token的区别


 1、JWT(不可撤回)  

  JWT是一个非常轻巧的规范,一般被用来在身份提供者和服务提供者间传递安全可靠的信息。JWT令牌是一个自包含的访问令牌 - 它是一个带有声明和过期的受保护数据结构。一旦API了解了密钥材料,它就可以验证自包含的令牌,而无需与发行者进行通信。这使得JWT难以撤销。它们将一直有效,直到它们过期。

  JWT常被用于前后端分离,可以和 Restful API 配合使用,常用于构建身份认证机制,一个 JWT 实际上就是一个字符串,它包含了使用.分隔的三部分: Header 头部 Payload 负载 Signature 签名(格式:Header.Payload.Signature)

在这个三个部分中最关键的就是signature。

  signature:被用来确认JWT信息的发送者是谁,并保证信息没有被篡改,使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密。因此签名算法推荐使用RSA或ECDSA非对称加密算法。

JWT特点:

  A、JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。

  B、为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输

  C、jwt去中心化的思想:api资源收到第一个请求之后,会去id4服务器获取公钥,然后用公钥验证token是否合法,如果合法进行后面的有效性验证。有且只有第一个请求才会去id4服务器请求公钥,后面的请求都会用第一次请求的公钥来验证,这也是jwt去中心化验证的思想。(注:如果签名证书发生改变则需要重启有请求ids4服务器的资源服务器。)

  D、JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

 

2、Reference Token(不携带任何用户数据,可撤回)

  当使用 Reference token 的时候,服务端会对 Token 进行持久化,当客户端请求资源端(API)的时候,资源端需要每次都去服务端通信去验证 Token 的合法性[/connect/introspect],IdentityServer4.AccessTokenValidation 中间件中可以配置缓存一定的时候去验证,并且 Token 是支持撤销[/connect/revocation]的。

  使用引用令牌时 - IdentityServer会将令牌的内容存储在数据存储中,并且只会将此令牌的唯一标识符发回给客户端。接收此引用的API必须打开与IdentityServer的反向通道通信以验证令牌。如下:access_token就是唯一标识。(注不携带任何数据)

 640?wx_fmt=png

   当 AccessTokenType 定义为 Reference 的时候,验证资源端要注意配置 ApiSecrets 以确保 POST /connect/introspect HTTP/1.1 接口能验证通过,当 AccessTokenType 定义为 Jwt 的时候则资源端可不配置 options.ApiSecret 选项。如下图:

 640?wx_fmt=png

Reference Token官方图如下:

640?wx_fmt=png

 以上就是JWT与Reference token的区别。为了减少访问中心服务器的资源,使用JWT还是非常棒的,毕竟与服务器交互的资源还是非常的昂贵的。不过具体的还得视实际情况而定。

那么我们来看一下在IDS4中API使用JWT以及Reference Token的交互流程图

 

三、IDS4中API使用JWT以及Reference Token与认证中心的交互流程图


此图为:JWT,当然大家可以通过fiddler 抓包工具来查看一下具体的数据流就能明白其中的道理。

注:资源服务器在第一次解析AccessToken的时候会先到授权服务器获取配置数据(例如会访问:http://localhost:5000/.well-known/openid-configuration 获取配置的,http://localhost:5000/.well-known/openid-configuration/jwks 获取jwks)),之后解析AccessToken都会使用第一次获取到的配置数据,因此如果授权服务的配置更改了(加密证书等等修改了),那么应该重启资源服务器使之重新获取新的配置数据;

640?wx_fmt=png

 

 此图为:Reference Token

640?wx_fmt=png

 以上即JWT与Reference Token 流程图。

四、JWT中使用RSA加密


在说明JWT使用RSA加密之前我们先来比较一下其他的加密算法

1、HS256与RS256的区别

  HS256 使用密钥生成固定的签名,RS256 使用成非对称进行签名。简单地说,HS256 必须与任何想要验证 JWT的 客户端或 API 共享秘密。即 如下图

640?wx_fmt=png

 

  RS256 生成非对称签名,这意味着必须使用私钥来签签名 JWT,并且必须使用对应的公钥来验证签名。与对称算法不同,使用 RS256 可以保证服务端是 JWT 的签名者,因为服务端是唯一拥有私钥的一方。这样做将不再需要在许多应用程序之间共享私钥


2、创建自签名证书(操作步骤)

  生产环境(负载集群)一般需要使用固定的证书签名与验签,以确保重启服务端或负载的时候 Token 都能验签通过。(不使用临时证书)

那么证书如何生成请看下面分解步骤:

  第一种:使用OpenSSL生成证书,注:RSA加密证书长度要2048以上,否则服务运行会抛异常

#Linux系统生成证书:(推荐使用)
sudo yum install openssl (CentOS)
#生成私钥文件 openssl genrsa
-out idsrv4.key 2048

#创建证书签名请求文件 CSR(Certificate Signing Request),用于提交给证书颁发机构(即 Certification Authority (CA))即对证书签名,申请一个数字证书。 openssl req -new -key idsrv4.key -out idsrv4.csr
#生成自签名证书(证书颁发机构(CA)签名后的证书,因为自己做测试那么证书的申请机构和颁发机构都是自己,crt 证书包含持有人的信息,持有人的公钥,以及签署者的签名等信息。当用户安装了证书之后,便意味着信任了这份证书,同时拥有了其中的公钥。) openssl x509
-req -days 365 -in idsrv4.csr -signkey idsrv4.key -out idsrv4.crt (包含公钥)
#自签名证书与私匙合并成一个文件(注:.pfx中可以加密码保护,所以相对安全些) openssl pkcs12
-export -in idsrv4.crt -inkey idsrv4.key -out idsrv4.pfx (注:在生成的过程中会让我们输入Export Password)


 证书截图如下:

640?wx_fmt=png

 

640?wx_fmt=png

  第二种:

openssl req -newkey rsa:2048 -nodes -keyout idsrv4.key -x509 -days 365 -out idsrv4.cer
openssl pkcs12 -export -in idsrv4.cer -inkey idsrv4.key -out idsrv4.pfx

 

生成如下:

640?wx_fmt=png

 

3、证书生成之后就可进入VS2017中配置

拷贝生成的证书,放到认证/授权服务器项目中。(VS中配置文件设置文件始终复制),最后把证书路径和密码配置到 IdentityServer 中,因为我们自签名的证书是 PKCS12 (个人数字证书标准,Public Key Cryptography Standards #12) 标准包含私钥与公钥)标准,包含了公钥和私钥。

 A、在appsetting.json 配置文件中添加如下:此处需要配置password,自定义即可。

640?wx_fmt=png

 

B、在starup.cs中ConfigureServices方法中配置如下即可。

640?wx_fmt=png

 

配置完后即可。我们启动IDS4项目即可生成加密的token。

640?wx_fmt=png

 

将得到的token在jwt.io 网站来认证一下:把后缀为 crt 公钥、key私钥复制到验证中,发现认证ok。这样即可实现防篡改。

 

640?wx_fmt=png

 

五、总结


在实际环境中应该使用加密的token,而不应该使用临时令牌。以及尽量设置token的过期时间短,以及刷新token的机制,这样可以尽可能的保护token以及数据安全。

原文地址https://www.cnblogs.com/guolianyu/p/9872661.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

2020牛客国庆集训派对day4 What Goes Up Must Come Down

What Goes Up Must Come Down 题意: 我们规定一个序列合理:当一个序列左部分是非降序列,右部分是非升序列(左右部分可为0,也就是整体可以为非降序列,非升序列) 题解: 树状数组来…

codeforces1451 E. Bitwise Queries(位运算妙用)

E1. Bitwise Queries (Easy Version) ab(a&b)(a∣b)ab(a\&b)(a|b)ab(a&b)(a∣b) 根据上述式子用333次$&和333次∣|∣操作求出a1a2,a2a3,a1a3a_1a_2,a_2a_3,a_1a_3a1​a2​,a2​a3​,a1​a3​由此得出a1,a2,a3a_1,a_2,a_3a1​,a2​,a3​ 根据a1⊕aixa_1\oplus a…

P4240-毒瘤之神的考验【莫比乌斯反演,平衡规划】

正题 题目链接:https://www.luogu.com.cn/problem/P4240 题目大意 QQQ组数据给出n,mn,mn,m求 ∑i1n∑j1mφ(ij)\sum_{i1}^n\sum_{j1}^m\varphi(i\times j)i1∑n​j1∑m​φ(ij) 1≤Q≤104,1≤n,m≤1051\leq Q\leq 10^4,1\leq n,m\leq 10^51≤Q≤104,1≤n,m≤105 解题思路 首先…

【最小生成树】水箱(P5952)

正题 P5952 题目大意 有一个n*m的网格,每个网格之间有一个板,给出每个板的高度(边界有一个高度为 ∞\infty∞ 的墙),在每个网格中注水(必须是非负整数),使得两个高度不等且相邻的网…

2020牛客国庆集训派对day4 Jokewithpermutation

Jokewithpermutation 题目描述 Joey had saved a permutation of integers from 1 to n in a text file. All the numbers were written as decimal numbers without leading spaces. Then Joe made a practical joke on her: he removed all the spaces in the file. Help Jo…

.NET Core使用IO合并技巧轻松实现千万级消息推送

之前讲述过多路复用实现单服百万级别RPS吞吐,但在文中有一点是没有说的就是消息IO合并,如果缺少了消息IO合并即使怎样多路复用也很难达到百万级别的请求响毕竟所有应用层面的网络IO读写都是非常损耗性能的(需要硬件配置很高的服务器)。这一章…

codeforces1457 C. Bouncing Ball

写这个题写了1h,赛后无意看见jly神的代码只能膜拜%%% C. Bouncing Ball 预处理从1→k1\to k1→k开始跳需要添加多少个平台,预处从k1→nk1\to nk1→n这些不难发现由于每次跳k格,只需要利用前缀和思想和前面预处理的结果即可做差求出。 然后枚…

P4491-[HAOI2018]染色【二项式反演,NTT】

正题 题目链接:https://www.luogu.com.cn/problem/P4491 题目大意 给nnn个物品染上mmm种颜色,若恰好有kkk个颜色的物品个数为SSS那么就会产生WkW_kWk​的贡献。求所有染色方案的贡献和 1≤n≤107,1≤m≤105,1≤S≤1501\leq n\leq 10^7,1\leq m\leq 10^5,1\leq S\l…

【传递闭包】【倍增】幸福路径(P4308)

正题 P4308 题目大意 给一个图,每个点有一个权值 axa_xax​,当你经过一条边时体力p\times pp(体力初始为1),每到一个点造成的贡献为体力ax\times a_xax​,问最大贡献(路径可能是无限长的&…

天气情况图像分类练习赛 第三阶段(赛中感)

第三阶段也是实战阶段,不同于前两个阶段的填空而是实打实的预测分析 题目会给出8000张照片数据,其中6000作为训练集而另外2000张作位测试集,通过对6000张的训练来预测2000的结果,并将结果输出到csv文件中,提交检验成功…

一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相

在我们 2015 年开始的从 .NET Framework 向 .NET Core 迁移的工程中,遇到的最大的坑就是标题中所说的——同步方法中调用异步方法发生”死锁”。虽然在 .NET Framework 时代就知道不能在同步方法中调用异步方法,但我们却明知路有坑,偏向此路行…

codeforces1456 D. XOR-gun

D. XOR-gun 大佬题解 当n比较大的时候,一定有连续相同的3个数最高位都是1,只需要将这三个数其中两个异或一次即可满足题意只需要操作1次。 当n比较小时可以直接暴力,不难发现异或操作要么是一段区间异或然后与区间端点相邻的比较O(n2)O(n^2…

AT4119-[ARC096C]Everything on It【斯特林数,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/AT4119 题目大意 一个集合S{k∈[1,n]∪N}S\{k\in[1,n]\cup N\}S{k∈[1,n]∪N},它的所有子集作为元素组成的集合中要求满足每一个数字的出现之和不小于222,求方案数对PPP取模。 1≤n≤3000,P∈[108,109…

【交互】【随机】Lost Root(CF1061F)

正题 luogu CF1061F 题目大意 给出n和k,现在有一颗n个点的满k叉树,每次查询可以问一个点是否在另外两个点的路径上,让你在 60n60\times n60n 次询问内得到根节点 解题思路 因为是满k叉数,可以先得到深度dep 每次随机找两个点&…

take

take 题解参考 题目描述 Kanade has n boxes , the i-th box has p[i] probability to have an diamond of d[i] size. At the beginning , Kanade has a diamond of 0 size. She will open the boxes from 1-st to n-th. When she open a box,if there is a diamond in it an…

将传统 ASP.NET 应用迁移到 .NET Core

点击蓝字关注我现在越来越多的人在谈论. NET Core。诚然,.NET Core 是未来, 但是.NET Framework 仍在支持, 因为大量的应用程序无法在短时间内迁移。.NET Core 和 .NET Framework 就像电动汽车和汽油动力汽车。汽油车是成熟的,你可以毫无任何问题驾驶它&…

CF932G-Palindrome Partition【PAM】

正题 题目链接:https://www.luogu.com.cn/problem/CF932G 题目大意 给出一个长度为nnn的字符串,将其分为kkk段(kkk为任意偶数),记为ppp。要求满足对于任意iii都有pipk−i1p_ip_{k-i1}pi​pk−i1​。求方案数。 1≤n≤1061\leq n…

2018 ACM ICPC Asia Regional - Seoul B.Cosmetic Survey

参考大佬代码 题目大意 nnn个顾客,mmm种画妆品,每一个顾客会给mmm种化妆品一个值,这个值代表这个化妆品在他心中的排名,排名越小越喜欢,如果这个值为0说明最不喜欢这一种化妆品(值为0理解为无穷大&#xf…

The table(CF226D)

正题 CF226D 题目大意 给一个n*m的矩阵,每次操作可以使一行或一列全部变号(变-,-变),问如何操作可以使所有行列之和都是正数 解题思路 考虑每次暴力找小于0的一行或一列,然后反转 因为每次反转肯定会使…

[翻译] 初看 ASP.NET Core 3.0 即将到来的变化

原文: A first look at changes coming in ASP.NET Core 3.0在我们努力完成下一个 minor 版本的 ASP.NET Core 的同时,我们也在对下一个 major 版本进行更新,其中包括如何使用框架组合项目、更紧密的 .NET Core 集成以及第三方开源集成,所有这…