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
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
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.3</version>
</dependency>
4、Nimbus-JOSE-JWT
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星。