为啥要使用环境变量对 JSON Web 令牌 (JWT) 进行签名?

Posted

技术标签:

【中文标题】为啥要使用环境变量对 JSON Web 令牌 (JWT) 进行签名?【英文标题】:Why should JSON Web Tokens (JWT) be signed with an environment variable?为什么要使用环境变量对 JSON Web 令牌 (JWT) 进行签名? 【发布时间】:2016-02-12 02:48:09 【问题描述】:

在各种教程中,我发现他们都说“JWT 应该由环境变量签名,而不是硬编码到应用程序中”。从安全的角度来看,如果黑客要访问我的 Node.js 应用程序的源代码,我假设他们也可以看到服务器系统上的环境变量?从 Node 内部调用环境变量与对应用程序的源代码进行硬编码相比,在本质上如何更安全?

【问题讨论】:

【参考方案1】:

这有几个原因。

1) 对于每个环境,您的 JWT 签名密钥应该不同(例如,您不希望您的开发人员知道您的生产签名密钥)。实现这一点的最简单方法是使用环境变量。

2) 你应该从代码库中抽象出秘密的东西。所以这要么意味着配置文件或环境变量。

3) 如果有人确实可以访问您的资源,他们至少不会拥有王国的钥匙。

4) 关注点分离。

【讨论】:

关于第 3 点,有人如何访问仅在一个系统上运行的源,而不访问系统本身? Node 是否存在缺陷,因此可以读取后端代码? 这是假设性的,但是是的——前端 Web 服务器中的缺陷或错误配置可能允许访问源代码,但不允许访问环境变量。或者,如果您的应用执行与文件系统读取和写入相关的任何操作,您最终可能会遇到类似情况。 您是否有更多关于涉及前端错误配置的安全漏洞的信息? 不确定你在找什么,但主要的可能是使用 Apache / nginx 提供静态文件,但没有锁定目录 docroot(或者只是意外地将其指向错误的位置) 有道理。我的目标之一是尝试使我的应用程序尽可能地防弹,因此我尝试了解为什么提出安全建议的所有原因和场景。我更想知道是否有任何文章或资源想到可能意外暴露后端代码库的情况【参考方案2】:

环境变量只能在正在运行的系统上使用。但是,您的源代码可能位于版本控制存储库(Github、Bitbucket 等)中、您的开发系统中、可能位于许多备份位置等中。

本质上一个环境变量在一个地方,你的源代码可能在多个地方。

【讨论】:

但是如果我非常小心并在点击“npm start”之前更改了我的代码库中的变量,是否存在任何理论上的安全缺陷? 显然出于“人为原因”,使用环境变量是一个好主意,以防我忘记更改内容,但我更好奇是否有技术安全利益而不是实际利益跨度>

以上是关于为啥要使用环境变量对 JSON Web 令牌 (JWT) 进行签名?的主要内容,如果未能解决你的问题,请参考以下文章

了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)

为啥 JSON Web Token (JWT) 在不知道密钥的情况下解密

Json Web 令牌 - jose4j - SyntaxError:JSON 中位置 0 的意外令牌 e

对 Bearer 令牌使用 JSON Web 令牌和 Firestore 支持

JSON Web 令牌过期和记住我功能

了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)