【问题标题】:Node.js - Storing password in env variableNode.js - 在环境变量中存储密码
【发布时间】:2018-12-14 20:01:54
【问题描述】:

我正在为我的应用程序创建管理员凭据,模型非常简单,它具有用户名和密码属性以及一些验证。我有一个函数可以将一些信息填充到数据库中。

async function init() {
  const admin = new Admin({
    username: "admin",
    password: "12345"
  });

  const salt = await bcrypt.genSalt(10);
  admin.password = await bcrypt.hash(admin.password, salt);

  try {
    await admin.save({ username: admin.username });
  } catch (ex) {
    console.log(ex.message);
  }
}

但是,通过这种方法,我将密码保存在我的源代码中,我不希望这样。我在想也许我可以使用 config 包将我的管理员密码存储在环境变量中。

我尝试了以下方法:

  • 创建了一个 default.json 文件:

    { "adminPassword": "" }

  • 创建了一个 custom-environment-variables.json 文件:

    { "adminPassword": "fifteen_adminPassword" }

  • 然后将我的代码修改为:

const admin = new Admin({ username: "admin", password: config.get("adminPassword") });

最后我设置了环境变量export fifteen_adminPassword=12345,但是在我进行身份验证时这会因为密码无效而失败。

【问题讨论】:

  • 您是否验证过config.get("adminPassword") 返回了预期的结果?有没有可能是undefinedconfig 实现是什么样的?
  • 如何查看config.get("adminPassword") 返回的内容? config 实现看起来就像我在原始帖子中解释的那样,我还有其他属性,但它们与这个问题无关,这就是我没有包括它们的原因。
  • 您可以调试解决方案并检查值,也可以简单地console.log(config.get("adminPassword"))
  • 嗯,它返回“1212345”,这不是我在环境变量中设置的密码。所以为了覆盖这个我跑了export fifteen_adminPassword=12345。我这样做了,现在它在控制台中返回 12345,但是当我尝试进行身份验证时仍然收到无效密码错误...
  • 好吧,这更近了一步 :) admin-user 创建工作正常吗?密码加密有问题吗?

标签: javascript node.js environment-variables config


【解决方案1】:

我以前用过 config 包,但我太头疼了。所以我切换到 env-cmd 包。以下是您应该如何实施:

npm install env-cmd

然后在您的根文件夹中创建一个 /config 目录。在其中创建一个 dev.env 文件。像这样在这里输入你的变量

/config/dev.env

PORT=3000
ADMIN_PASSWORD=fifteeen_adminpassword

注意,为了命名约定,环境变量总是大写字母,我们用“_”分隔它们。和值不是字符串。

现在您需要配置 package.json 文件。在“脚本”中,我们通常有启动、开发、测试脚本。 start 用于部署平台,为我们当前的开发环境进行测试和开发。如果您使用的是 nodemon(很可能是),您的开发脚本应该是这样的。

"scripts": {
    "start": "node src/index.js",
    "dev": "nodemon src/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

当您运行npm run dev 时,终端将运行此nodemon src/index.js。这是任何节点应用程序的基本配置。现在我们需要传递存储在 /config/dev.env 中的变量。到我们的应用程序。为此将“dev”更改为

"dev": "env-cmd -f ./config/dev.env nodemon src/index.js",

现在 env-cmd 包将您传递给 /config/dev.env 的所有变量设置为环境变量。现在你可以像这样使用它们:

const admin = new Admin({
        username: "admin",
        password: process.env.ADMIN_PASSWORD
      });

请注意,当您将项目部署到 github 时,您已将配置文件夹名称添加到 .gitignore 文件中。所以你的密码或 api 密钥不会被公开。

每次你添加一个新变量到 dev.env 终止终端进程并重新启动它时。 mongodb 会报错。

【讨论】:

    【解决方案2】:

    您已经在对密码进行哈希处理,因此您不再需要它作为明文。为什么要在之后存储明文密码

    您为什么不将散列密码存储在您的代码(可能不太好,因为它不灵活)或某个配置文件中? 除了introducing more risks之外,我看不出环境变量会给代码中的密码带来什么好处。

    如果您的应用程序需要凭据才能登录任何服务,并且您无法保留密码哈希(例如,因为您需要使用真实密码登录),则需要存储明文密码。如果您正在设计用户管理并控制登录机制,您很可能不需要存储明文密码,而是可以存储哈希值并将其用于登录。

    如果您仍想存储明文密码,则应尝试将它们存储在安全位置(环境变量不是安全位置)。 你可以:

    • 将密码存储在密码管理器/安全位置(例如 iOS 钥匙串)
    • 使用应用程序启动时输入的密码加密密码,然后将加密后的密码保存在应用程序的某个配置文件中
    • 使用密码短语加密密码,密码短语又存储在安全位置(例如,~/.ssh/ 目录,只有用户可读)。请注意,这只是一层薄薄的安全保护,但提供了最大的舒适度

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2018-03-09
      相关资源
      最近更新 更多