使用 RS256 生成的 JWT 可以被 jwt.io 网站解码吗?

Posted

技术标签:

【中文标题】使用 RS256 生成的 JWT 可以被 jwt.io 网站解码吗?【英文标题】:Can a JWT produced with RS256 be decoded by the jwt.io website? 【发布时间】:2021-10-31 00:33:03 【问题描述】:

最近我制作了我的第一台 Express 服务器并使用 jwt 添加了用户身份验证。现在我正在寻找一种方法来加密该 jwt,以便用户将无法在https://jwt.io 网站中看到有效负载。

有谁知道这种加密算法是否会阻止用户在没有公钥/私钥的情况下看到有效载荷?

【问题讨论】:

如果它被正确加密并且您的用户没有密钥,那么根据定义,没有任何东西可以解密它。 我的印象是密钥在那里是为了防止每个人都对令牌内容进行调整,但以任何方式避免解密令牌? @nubinub JWT 默认是 签名 的,这使得它们清晰易读,但耐火候。还有一个 encrypted JWT 规范,这也使得内容不可读。 @deceze 哪个规范使 JWT 不可读? en.wikipedia.org/wiki/JSON_Web_Encryption 【参考方案1】:

RS256 使用数字签名来确保生成的令牌的完整性、真实性和不可否认性。它不保证机密性。

如果您想将 JWE(JSON Web 加密)与 JWT 一起使用,您可以。而且由于您既是令牌的发行者又是接收者,我建议使用对称加密。实际上,您可能不会使用非对称加密,因为任何拥有公钥的人都可以进行加密,而您无法确保您确实是最初制作 JWE 的人。

您需要一个支持 JWE 格式的 JWT 的实现/库。这会给你完整性、真实性和保密性。例如:

npm install jose@3

要加密使用EncryptJWT

import * as crypto from 'crypto'
import  EncryptJWT  from 'jose/jwt/encrypt'

const secretKey = crypto.randomBytes(32) // you would pass your own 32 byte secret as a Buffer

const jwt = await new EncryptJWT( 'urn:example:claim': true )
  .setProtectedHeader( alg: 'dir', enc: 'A256GCM' )
  .setIssuedAt()
  .setIssuer('urn:example:issuer')
  .setAudience('urn:example:audience')
  .setExpirationTime('2h')
  .encrypt(secretKey)

这会生成一个 JWE 格式的 JWT,这样,在 secretKey 不知情的情况下,就无法解密其有效负载

eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..Wz7DdwAPlbq4cYxn.OMfWJTMuyfLcdN4g541KfcDFKaL5y2bBaFIxuC_-mVa7YLE4M7bVfiO9R2umvpD_acGj5l3gvxulcRnHzBMeRpm4qgbJuWVdA1fYUOguDs1h2xtesZ_9iZUEtcu3hEJ1wVM46ad-9dPebe_VaWwe4XVU5GM.7lDflVFg_Qm3N88xX8Dy1A

要解密和验证 JWT 声明集,请使用 jwtDecrypt

import  jwtDecrypt  from 'jose/jwt/decrypt'

const  payload, protectedHeader  = await jwtDecrypt(jwt, secretKey, 
  issuer: 'urn:example:issuer',
  audience: 'urn:example:audience'
)

【讨论】:

如何创建那个 32 字节的缓冲键? @FilipSkokan 您可以使用例如生成一个openssl rand -hex 32 然后Buffer.from(hexSecret, 'hex')。保守秘密,不要将其提交给源代码控制,在部署时使用环境变量或秘密管理器来获取值。

以上是关于使用 RS256 生成的 JWT 可以被 jwt.io 网站解码吗?的主要内容,如果未能解决你的问题,请参考以下文章

Jwt介绍

节点 js JWT 令牌不是使用 RS256 算法生成的

sh 如何生成JWT RS256密钥

sh 如何生成JWT RS256密钥

sh 如何生成JWT RS256密钥

在 C# 中使用 RS256(非对称)验证 JWT