Java JWT开源库综述
- 2019.12.17日
一、简介
根据JWT官网的介绍,Java编程中可用的开源JWT库有:
- maven: com.auth0 / java-jwt / 3.3.0
- maven: org.bitbucket.b_c / jose4j / 0.6.3
- maven: com.nimbusds / nimbus-jose-jwt / 5.7
- maven: io.jsonwebtoken / jjwt / 0.9.0
- maven: io.fusionauth / fusionauth-jwt / 3.1.0
- maven: io.vertx / vertx-auth-jwt / 3.5.1
六种库的特性对比表
| JWT特性 | java-jwt | jose4j | nimbus-jose-jwt | jjwt | fusionauth-jwt | vertx-auth-jwt | 
| 签名 | √ | √ | √ | √ | √ | √ | 
| 验证 | √ | √ | √ | √ | √ | √ | 
| iss 检查 | √ | √ | √ | √ | √ | √ | 
| sub 检查 | √ | √ | X | √ | √ | √ | 
| aud 检查 | √ | √ | √ | √ | √ | √ | 
| exp 检查 | √ | √ | √ | √ | √ | √ | 
| nbf 检查 | √ | √ | X | √ | √ | √ | 
| iat 检查 | √ | √ | X | √ | √ | √ | 
| jti 检查 | √ | √ | X | √ | √ | X | 
| HS256算法 | √ | √ | √ | √ | √ | √ | 
| HS384算法 | √ | √ | √ | √ | √ | √ | 
| HS512算法 | √ | √ | √ | √ | √ | √ | 
| RS256算法 | √ | √ | √ | √ | √ | √ | 
| RS384算法 | √ | √ | √ | √ | √ | √ | 
| RS512算法 | √ | √ | √ | √ | √ | √ | 
| ES256算法 | √ | √ | √ | √ | √ | √ | 
| ES384算法 | √ | √ | √ | √ | √ | √ | 
| ES512算法 | √ | √ | √ | √ | √ | √ | 
| PS256算法 | X | √ | √ | √ | X | ? | 
| PS384算法 | X | √ | √ | √ | X | ? | 
| PS512算法 | X | √ | √ | √ | X | ? | 
| EdDSA算法 | ? | ? | ? | ? | ? | ? | 
综上可见,完整实现了JWT特性的开源库只有jose4j和jjwt两个库。尽管在普通项目中以上六个库皆可用,但遇到某些特殊需求的场景,就可能需要更换库。有鉴于此,应优先选择jose4j和jjwt两个库。
二、开源库分析
1、jose4j
- 见:https://bitbucket.org/b_c/jose4j/wiki/Home
jose4j是一个遵循JWT和JOSE规范套件的开源实现,以Apache 2.0许可证发布。jose4j采用Java编写,完全依靠JCA API进行加密。
<dependency>
    <groupId>org.bitbucket.b_c</groupId>
    <artifactId>jose4j</artifactId>
    <version>0.7.0</version>
  </dependency>2、jwtk/jjwt
- 见:https://github.com/jwtk/jjwt
- GitHub目前有5.8k星。
JJWT旨在成为最易于使用和理解的库,用于在JVM和Android上创建和验证JWT令牌。
JJWT是基于JWT、JWS、JWE、JWK和JWA的RFC规范的纯Java的开源实现,以Apache 2.0许可证发布。
JJWT库由Okta的资深架构师Les Hazlewood创建,并由GitHub贡献者社区提供支持和维护。
另外,JJWT还额外添加了一些不属于该规范的便利扩展,例如JWS压缩和声明的执行。
JJWT的特征
- 所有JDK和Android上的全功能实现
- 自动化的安全最佳实践和断言
- 易于学习,API易读
- 方便易读的、流畅的接口,支持IDE的代码自动完成功能
- RFC规范的完全兼容,并通过RFC-specified测试向量的测试
- 稳定的实现,执行测试代码覆盖率100%。
- 创建、解析和验证紧凑型JWT(compact JWTs,又名JWSs)的数字签名,支持所有标准JWS算法
- 额外的增强功能:
- 对较大的JWT的Body压缩,不仅是JWEs
- 声明断言(需要特定的值)
- 声明POJO的编组(marshaling)和解组(unmarshaling)
- 基于期望的JWA算法生成安全密钥
- 更多…
目前不支持的特性
- 非紧凑型JWT的序列化和解析
- JWE (Encryption for JWT)
这两个特性会在后续的版本中实现。
3、auth0/java-jwt
- 见:https://github.com/auth0/java-jwt
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.8.3</version>
</dependency>4、Nimbus-JOSE-JWT
- 见:https://bitbucket.org/connect2id/nimbus-jose-jwt/wiki/Home
5、FusionAuth/fusionauth-jwt
- 见:https://github.com/fusionauth/fusionauth-jwt
- GitHub目前才28星。
6、vert-x3/vertx-auth
- 见:https://github.com/vert-x3/vertx-auth
- GitHub目前才97星。
                










