Node.js: 管理密钥信息

如何使用 Node.js 管理密钥信息

👋 欢迎使用 Stackhero 文档!

Stackhero 提供现成的 Node.js 云 解决方案,具有众多优势,包括:

  • 通过简单的 git push 在几秒钟内 部署您的应用程序。
  • 使用您自己的域名,并享受 HTTPS 证书的自动配置以增强安全性。
  • 享受自动备份一键更新以及简单、透明和可预测的定价带来的安心。
  • 通过专用私有 VM获得最佳的性能和强大的安全性

节省时间简化您的生活:只需 5 分钟即可试用 Stackhero 的 Node.js 云托管 解决方案!

当您的 Node.js 项目需要与数据库、对象存储或外部 API 交互时,安全地存储凭证(如用户名、密码或令牌)非常重要。这些凭证通常被称为“密钥信息”(secrets)。保护您的密钥信息的机密性对于保障应用程序的安全至关重要。

一开始,您可能会考虑直接在代码中写入凭证,例如:

// 连接到 PostgreSQL 数据库
const pg = new Client({
  host: '<XXXXXX>.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

然而,这种做法并不安全。因为您的密钥信息很容易被提交到 Git 仓库,任何有权限的人都能看到。即使您认为只有自己有访问权限,这也类似于把写有密码的便签贴在显示器上,希望没人注意到。最终,这可能导致严重的安全问题。

此外,将密钥信息硬编码在代码中,会让开发和生产等不同环境的管理变得非常困难。

业界普遍推荐的最佳实践是将密钥信息存储在环境变量中。

环境变量是在代码之外定义的,并且在 Node.js 启动前设置。这样,所有密钥信息都通过环境变量定义,永远不会被硬编码到应用程序中。

您可以在启动 Node.js 命令时设置环境变量,例如:

MY_PASSWORD=myDevelopmentPassword node app.js

此命令会创建一个名为 MY_PASSWORD 的变量,值为 myDevelopmentPassword。格式很简单:<KEY>=<value>

按照惯例,环境变量通常使用大写字母。需要注意的是,环境变量只能存储字符串,不能存储数组或对象。

在您的 app.js 文件中,可以通过 process.env 访问环境变量,例如:

console.log(process.env.MY_PASSWORD);

这将输出 myDevelopmentPassword

现在,您的密码已经定义在代码之外,这有助于避免其意外进入 Git 仓库。

如果您在生产环境中使用 Stackhero,可以直接在 Node.js 服务的控制台中定义名为 MY_PASSWORD 的新环境变量,值为 myProductionPassword。这样可以轻松地在不同环境之间切换。

Stackhero 控制台上的 Node.js 配置示例Stackhero 控制台上的 Node.js 配置示例

通过这种方式,您的密码不再存储在代码中,并且可以为开发和生产环境分别使用不同的凭证。

在实际项目中,通常需要管理多个密钥信息。例如,连接数据库时,可能需要主机名、用户名和密码。

管理单个密钥信息很简单,但如果有多个,手动维护会变得很繁琐。想象一下用如下命令启动应用:

POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js

这样很快就会变得难以阅读和维护。在生产环境中,变量可能更多,这种方式就不太可行了。

这时,dotenv 库就能派上用场。

使用 dotenv,您可以将密钥信息存储在一个名为 .env 的独立文件中。

首先,您可以通过以下命令安装 dotenv 库:

npm install dotenv

接下来,创建一个 .env 文件来存放您的变量:

POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword

为了保证密钥信息安全,请确保 .env 文件不会被加入到 Git 仓库。可以通过将其添加到 .gitignore 文件来实现:

echo ".env" >> .gitignore

最后,在 app.js 文件顶部加载 dotenv 库:

require("dotenv").config();

这样配置后,当您在开发环境中使用 node app.js 启动应用时,dotenv 会自动读取 .env 文件。在生产环境中,无需 .env 文件,环境变量会直接从 Node.js 服务配置中获取,您可以通过 Stackhero 控制台进行管理。

理论讲完了,下面来看一个实际的例子。

您可以在这里找到完整的示例:https://github.com/stackhero-io/dotenvWithNodejs

通过这些方法,您可以灵活且安全地管理密钥信息,让整个流程变得简单高效。