单点登录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
生成私钥:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成的私钥不能直接使用 需要转换
私钥转换成pkcs8使用 :openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
查看你下生成的公钥和私钥
//查看公钥
cat rsa_public_key.pem
//查看私钥
cat pkcs8_rsa_private_key.pem
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
//核心代码(根据自己的业务调整 生成环境 公钥私钥 应为外部读取)
5测试这个小demo
5.1测试代码展示
5.2输出结果展示
5.3输出结果验证
//输出结果是
//验证网址 www.jwt.io //jwt官网
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdXRob3JpdGllcyI6ImFkbWluIiwic3ViIjoienMiLCJleHAiOjE1NDkzNjEyMTh9.ccTGX33vRzqklkX118HJ4lAPfjDZbe5QRMrmdOHGnnzXtL3ioM1wYmWa2rkZ3P-gBUm9suMYmZ1x7WNm23sGkM1nzdyDbMlshusbjgMF1c9JlF4AMVjmytzgaPe3qToHBEYf-Te_2tKy1TBF8U12ZoHsELaVZYafbOZhn-OCI
//验证结果
//把公钥或私要输入到这里
验证成功!
6.完成 jtw常用于单点登录token的令牌颁布(将token放到请求头中用拦截器拦截处理是否有效)、消息传递 根据自己的业务自行处理吧!
以上是关于单点登录JWT的使用(使用RSA签名验证)的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP 从 login.microsoftonline.com 验证 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,公钥验证签名