对“jose”库使用 TextEncoder 时,JWT env 密钥是否会暴露?

问题描述 投票:0回答:1

我正在使用“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)
}
javascript jwt
1个回答
0
投票

我不明白反对票,我认为对于尚未了解这一点的人来说这是一个公平的问题。希望能给大家带来一些光明!

环境变量通常在 Web 服务器上用于保密。每个秘密都需要位于内存中的某个位置,以便 Web 应用程序能够访问它,因此我们需要相信没有攻击者可以访问我们运行 Web 服务器的计算机。如果存储在堆上的某个地方,它肯定会更加混乱,但无论如何,有技能的人都会找到它。

使用环境变量也是一种非常方便的方法,使“部署者”(如 CD 中的 github 操作,或手动部署的操作工程师)可以指定秘密,而无需将它们存储在源代码或 docker 中容器或类似的东西,因为这是一个很大的禁忌。

减少攻击面的一种方法是使用非对称密钥。现在,您的云拥有一台非常薄的机器,其唯一的任务是签署 JWT:s。只有本机才能访问密钥。所有其他机器只能访问用于验证 JWT:s 的公钥。获得对一台常规后端计算机(Web 应用程序运行的位置)的(root)访问权限的攻击者可能会造成很大的损害,但至少无法直接创建和签署他/她自己的 JWT :s 为您服务。

© www.soinside.com 2019 - 2024. All rights reserved.