一、前言


在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就是唯一标识。(注不携带任何数据)

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

Reference Token官方图如下:

以上就是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都会使用第一次获取到的配置数据,因此如果授权服务的配置更改了(加密证书等等修改了),那么应该重启资源服务器使之重新获取新的配置数据;

 此图为:Reference Token

以上即JWT与Reference Token 流程图。

四、JWT中使用RSA加密


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

1、HS256与RS256的区别

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

  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)

证书截图如下:

  第二种:

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

生成如下:

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

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

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

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

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

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

五、总结


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

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

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

IdentityServer4之JWT签名(RSA加密证书)及验签相关推荐

  1. 一篇搞定RSA加密与SHA签名|与Java完全同步

    看到这篇文章的同学可幸福了,当时在做RSA加密与签名的时候网上的资料简直不要太老,做完后实在是忍受不下去了,这篇文章我会详细讲解iOS如何实现RSA加密与签名,并且与Java完全同步,这是我的第二篇博 ...

  2. 数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)

    引言 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件.为现实网络安全化标准如今大部分的 B2B.B2C.P2P.O2O 等商业网站含有重要企业资料个人资料的信息资信网站 ...

  3. ios rsa java_一篇搞定RSA加密与SHA签名|与Java完全同步

    本文是投稿文章,作者:Panda_iOS 看到这篇文章的同学可幸福了,当时在做RSA加密与签名的时候网上的资料简直不要太老,做完后实在是忍受不下去了,这篇文章我会详细讲解iOS如何实现RSA加密与签名 ...

  4. RSA加密、解密、签名、验签(验证签名)RSA算法原理

    转载链接:https://www.jianshu.com/p/8dc4a5f64e06 https://www.cnblogs.com/pcheng/p/9629621.html RSA原理:http ...

  5. RSA加密、解密、签名、验签介绍

    参考链接:https://www.cnblogs.com/pcheng/p/9629621.html RAS简介 RSA加密是非对称加密,由一对秘钥进行完成加密解密,分别称为公钥和私钥,公钥加密,私钥 ...

  6. Java 实现RSA 签名/验签与加密解密

    文章目录 一.前言 二.签名与验签 1.程序代码如下: 2.程序运行结果: 三.加密解密 1.添加加解密方法 2.程序运行结果 一.前言 RSA 算法相比于AES算法不同的是RSA的秘钥为不同的两个一 ...

  7. python post请求rsa加密_Python的加密方式:RSA加密

    Python的加密方式:RSA加密 RSA加密是一种非对称加密,通常使用公钥加密,私钥解密,私钥签名,公钥验签. 在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)S ...

  8. php和java之间rsa加密互通

    以下是php封装好的类,引入即可使用 <?php /*** 作者:pjp* 邮箱:vippjp@163.com*/ class RSA{private $privateKey='';//私钥(用 ...

  9. 【转】php和java之间rsa加密互通

    以下是php封装好的类,引入即可使用 <?php /*** 作者:pjp* 邮箱:vippjp@163.com*/ class RSA{private $privateKey='';//私钥(用 ...

最新文章

  1. Android实现网页的放大与缩小
  2. 【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)
  3. 「软件测试基础」理论篇之软件测试概论
  4. Error during artifact deployment. See server log for details解决办法
  5. 晒晒今年淘宝网买的李宁鞋子
  6. OpenCV调用YOLOv4进行目标检测
  7. cmder 基本配置和使用
  8. 网页mp3提取器_用Python写一个酷狗音乐下载器!
  9. #Tomcat# 本地正常但是部署到服务器后,mysql插入中文乱码问题解决!
  10. Springboot实现的医院分针挂号住院管理系统
  11. [Linux] LD_LIBRARY_PATH
  12. 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版
  13. XenCenter开启虚机提示VDI不可用
  14. 冶金工程在计算机应用,冶金工程专业计算机应用能力
  15. Postman测试文件图片上传接口
  16. 基于Jsp+Servlet的宿舍管理系统(JavaWeb毕业设计源码)
  17. Ubuntu Desktop - Terminal 输出全部选中 + 复制
  18. Java游戏守卫者_守卫者 - Minecraft Wiki,最详细的官方我的世界百科
  19. 团建游戏----气球大赛
  20. 中国劳动力动态调查数据(CLDS)2011-2018年

热门文章

  1. 构建iscsi网络存储服务
  2. mysql-普通查询(General Query)慢查询(Slow Query)相关日志配置
  3. 人的一生能交多少朋友?
  4. 让未备案的网站先飙起来
  5. windows phone 8 的新特性
  6. google code for xbmc addons2
  7. Windows2008应用之配置客户端自动添加打印机
  8. windows7 + vs2008 + oracle + iis7 客户端配置成功
  9. CA周记 - 用 Visual Studio Code 做基于 .NET MAUI 跨平台移动应用开发
  10. 微软第二财季营收达 517 亿美元,净利润同比增长 21%