我正在使用“jose”库来验证和签署 JWT 令牌,“jose”需要使用 TextEncoder() 对 env 密钥进行编码,但不是有人只需要在编码密钥上运行 TextDecoder() 即可公开环境密钥? 我从所有教程中听说,您当然应该使用环境变量作为您的密钥,但是当它通过 TextEncoder 公开时有什么意义呢?
import { jwtVerify, SignJWT } from 'jose'
const verifyAndSignJWT = async () => {
const encodedKey = new TextEncoder().encode(process.env.JWT_SECRET_KEY)
const decodedKey = new TextDecoder().decode(encodedKey)
console.log(key: decodedKey) // (key: 'mySecretKeyIsExposed')
const token = request.cookies.get('accessToken')?.value
const decryptedToken = await jwtVerify(token, encodedKey)
const refreshToken = await new SignJWT(decryptedToken.payload)
.setProtectedHeader({alg: 'HS256'})
.setIssuedAt()
.setExpirationTime('1d from now')
.sign(encodedKey)
}
我不明白反对票,我认为对于尚未了解这一点的人来说这是一个公平的问题。希望能给大家带来一些光明!
环境变量通常在 Web 服务器上用于保密。每个秘密都需要位于内存中的某个位置,以便 Web 应用程序能够访问它,因此我们需要相信没有攻击者可以访问我们运行 Web 服务器的计算机。如果存储在堆上的某个地方,它肯定会更加混乱,但无论如何,有技能的人都会找到它。
使用环境变量也是一种非常方便的方法,使“部署者”(如 CD 中的 github 操作,或手动部署的操作工程师)可以指定秘密,而无需将它们存储在源代码或 docker 中容器或类似的东西,因为这是一个很大的禁忌。
减少攻击面的一种方法是使用非对称密钥。现在,您的云拥有一台非常薄的机器,其唯一的任务是签署 JWT:s。只有本机才能访问密钥。所有其他机器只能访问用于验证 JWT:s 的公钥。获得对一台常规后端计算机(Web 应用程序运行的位置)的(root)访问权限的攻击者可能会造成很大的损害,但至少无法直接创建和签署他/她自己的 JWT :s 为您服务。