最近我制作了我的第一台 Express 服务器并使用 jwt 添加了用户身份验证。现在我正在寻找一种方法来加密该 jwt,以便用户将无法在https://jwt.io网站中看到有效负载。
有谁知道这种加密算法是否会阻止用户在没有公钥/私钥的情况下看到有效负载?
最近我制作了我的第一台 Express 服务器并使用 jwt 添加了用户身份验证。现在我正在寻找一种方法来加密该 jwt,以便用户将无法在https://jwt.io网站中看到有效负载。
有谁知道这种加密算法是否会阻止用户在没有公钥/私钥的情况下看到有效负载?
RS256
使用数字签名来确保生成的令牌的完整性、真实性和不可否认性。它不保证机密性。
如果您想将 JWE(JSON Web 加密)与 JWT 一起使用,您可以。而且由于您既是令牌的发行者又是接收者,我建议使用对称加密。实际上,您可能不会使用非对称加密,因为拥有公钥的任何人都可以进行加密,并且您无法确保您确实是最初生产 JWE 的人。
您需要一个支持 JWE 格式的 JWT 的实现/库。这会给你完整性、真实性和保密性。例如:
npm install jose@4
加密使用EncryptJWT
import * as crypto from 'crypto'
import { EncryptJWT } from 'jose'
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'
const { payload, protectedHeader } = await jwtDecrypt(jwt, secretKey, {
issuer: 'urn:example:issuer',
audience: 'urn:example:audience'
})