SpringBoot实战电商项目mall(35k+star)地址:github.com/macrozheng/…
摘要
以前一直使用的是jjwt
这个JWT库,虽然小巧够用,但对JWT的一些细节封装的不是很好。最近发现了一个更好用的JWT库nimbus-jose-jwt
,简单易用,API非常易于理解,对称加密和非对称加密算法都支持,推荐给大家!
简介
nimbus-jose-jwt
是最受欢迎的JWT开源库,基于Apache 2.0开源协议,支持所有标准的签名(JWS)和加密(JWE)算法。
JWT概念关系
这里我们需要了解下JWT、JWS、JWE三者之间的关系,其实JWT(JSON Web Token)指的是一种规范,这种规范允许我们使用JWT在两个组织之间传递安全可靠的信息。而JWS(JSON Web Signature)和JWE(JSON Web Encryption)是JWT规范的两种不同实现,我们平时最常使用的实现就是JWS。
使用
接下来我们将介绍下
nimbus-jose-jwt
库的使用,主要使用对称加密(HMAC)和非对称加密(RSA)两种算法来生成和解析JWT令牌。
对称加密(HMAC)
对称加密指的是使用
相同
的秘钥来进行加密和解密,如果你的秘钥不想暴露给解密方,考虑使用非对称加密。
- 要使用
nimbus-jose-jwt
库,首先在pom.xml
添加相关依赖;
1 | 复制代码<!--JWT解析库--> |
- 创建
JwtTokenServiceImpl
作为JWT处理的业务类,添加根据HMAC
算法生成和解析JWT令牌的方法,可以发现nimbus-jose-jwt
库操作JWT的API非常易于理解;
1 | 复制代码/** |
- 创建
PayloadDto
实体类,用于封装JWT中存储的信息;
1 | 复制代码/** |
- 在
JwtTokenServiceImpl
类中添加获取默认的PayloadDto的方法,JWT过期时间设置为60s
;
1 | 复制代码/** |
- 创建
JwtTokenController
类,添加根据HMAC算法生成和解析JWT令牌的接口,由于HMAC算法需要长度至少为32个字节
的秘钥,所以我们使用MD5加密下;
1 | 复制代码/** |
- 调用使用HMAC算法生成JWT令牌的接口进行测试;
- 调用使用HMAC算法解析JWT令牌的接口进行测试。
非对称加密(RSA)
非对称加密指的是使用公钥和私钥来进行加密解密操作。对于
加密
操作,公钥负责加密,私钥负责解密,对于签名
操作,私钥负责签名,公钥负责验证。非对称加密在JWT中的使用显然属于签名
操作。
- 如果我们需要使用固定的公钥和私钥来进行签名和验证的话,我们需要生成一个证书文件,这里将使用Java自带的
keytool
工具来生成jks
证书文件,该工具在JDK的bin
目录下;
- 打开CMD命令界面,使用如下命令生成证书文件,设置别名为
jwt
,文件名为jwt.jks
;
1 | 复制代码keytool -genkey -alias jwt -keyalg RSA -keystore jwt.jks |
- 输入密码为
123456
,然后输入各种信息之后就可以生成证书jwt.jks
文件了;
- 将证书文件
jwt.jks
复制到项目的resource
目录下,然后需要从证书文件中读取RSAKey
,这里我们需要在pom.xml
中添加一个Spring Security的RSA依赖;
1 | 复制代码<!--Spring Security RSA工具类--> |
- 然后在
JwtTokenServiceImpl
类中添加方法,从类路径下读取证书文件并转换为RSAKey
对象;
1 | 复制代码/** |
- 我们可以在
JwtTokenController
中添加一个接口,用于获取证书中的公钥;
1 | 复制代码/** |
- 调用该接口,查看公钥信息,公钥是可以公开访问的;
- 在
JwtTokenServiceImpl
中添加根据RSA
算法生成和解析JWT令牌的方法,可以发现和上面的HMAC
算法操作基本一致;
1 | 复制代码/** |
- 在
JwtTokenController
类,添加根据RSA算法生成和解析JWT令牌的接口,使用默认的RSA钥匙对;
1 | 复制代码/** |
- 调用使用RSA算法生成JWT令牌的接口进行测试;
- 调用使用RSA算法解析JWT令牌的接口进行测试。
参考资料
官方文档:connect2id.com/products/ni…
项目源码地址
公众号
mall项目全套学习教程连载中,关注公众号第一时间获取。
本文转载自: 掘金