单点登录JWT的使用(使用RSA签名验证)

Posted 铭铭爱学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单点登录JWT的使用(使用RSA签名验证)相关的知识,希望对你有一定的参考价值。

本地环境 mac os

测试环境 CentOS

一、JTW介绍

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

二、JWT作用

  • Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

  • Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

三、JWT结构

3.1 JWT头

JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。

{

  "alg": "HS256",

  "typ": "JWT"

}

在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。

最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。

3.2 有效载荷

有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指定七个默认字段供选择。

  • iss:发行人

  • exp:到期时间

  • sub:主题

  • aud:用户

  • nbf:在此之前不可用

  • iat:发布时间

  • jti:JWT ID用于标识该JWT

除以上默认字段外,我们还可以自定义私有字段,如下例:

{

  "sub": "1234567890",

  "name": "chongchong",

  "admin": true

}

请注意,默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。

JSON对象也使用Base64 URL算法转换为字符串保存。

3.3签名哈希

签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。

首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),

secret)

在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分隔,就构成整个JWT对象。

四、使用

因为使用RSA加密所以需要预先生成公钥和私钥我使用的是openSSL去生成 各个系统安装openSSL工具自行百度吧

4.1生成RSA公钥私钥

  • 生成公钥:openssl genrsa -out rsa_private_key.pem 1024 单点登录JWT的使用(使用RSA签名验证)

  • 生成私钥:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 单点登录JWT的使用(使用RSA签名验证)

  • 生成的私钥不能直接使用 需要转换

  • 私钥转换成pkcs8使用 :openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt 单点登录JWT的使用(使用RSA签名验证)

查看你下生成的公钥和私钥

//查看公钥

cat rsa_public_key.pem

单点登录JWT的使用(使用RSA签名验证)

//查看私钥

cat pkcs8_rsa_private_key.pem

单点登录JWT的使用(使用RSA签名验证)

4.2下载JAR包

我使用的是jjwt

去maven仓库中找吧

依赖group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.0'

4.3在java中使用RSA构建JWT

PUBLIC_KEY 为 rsa_public_key.pem

PRIVATE_KEY 为 pkcs8_rsa_private_key.pem

//核心代码(根据自己的业务调整 生成环境 公钥私钥 应为外部读取)

单点登录JWT的使用(使用RSA签名验证)

5测试这个小demo

5.1测试代码展示

单点登录JWT的使用(使用RSA签名验证)

5.2输出结果展示

单点登录JWT的使用(使用RSA签名验证)

5.3输出结果验证

//输出结果是

//验证网址 www.jwt.io //jwt官网

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdXRob3JpdGllcyI6ImFkbWluIiwic3ViIjoienMiLCJleHAiOjE1NDkzNjEyMTh9.ccTGX33vRzqklkX118HJ4lAPfjDZbe5QRMrmdOHGnnzXtL3ioM1wYmWa2rkZ3P-gBUm9suMYmZ1x7WNm23sGkM1nzdyDbMlshusbjgMF1c9JlF4AMVjmytzgaPe3qToHBEYf-Te_2tKy1TBF8U12ZoHsELaVZYafbOZhn-OCI

//验证结果

//把公钥或私要输入到这里

验证成功!

6.完成 jtw常用于单点登录token的令牌颁布(将token放到请求头中用拦截器拦截处理是否有效)、消息传递 根据自己的业务自行处理吧!


以上是关于单点登录JWT的使用(使用RSA签名验证)的主要内容,如果未能解决你的问题,请参考以下文章

有干货的面试题 (持续更新)

golang JWT 无签名。 “加密/rsa:验证错误”

使用 PHP 从 login.microsoftonline.com 验证 JWT 中的签名

如何使用 RSA256 算法生成 JWT 签名?

net6 项目搭建及引用框架记录(log4net,autofac,exception,api result,jwt,efcore)八使用pfx证书RSA方式生成jwt签名的Token,公钥验证签名

net6 项目搭建及引用框架记录(log4net,autofac,exception,api result,jwt,efcore)八使用pfx证书RSA方式生成jwt签名的Token,公钥验证签名