Node.js-将密码存储在env变量中

时间:2018-12-14 20:01:54

标签: node.js config

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

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,但是在进行身份验证时,此操作失败,因为密码无效。

2 个答案:

答案 0 :(得分:0)

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

npm install env-cmd

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

/config/dev.env

PORT=3000
ADMIN_PASSWORD=fifteeen_adminpassword

请注意,对于命名约定,env变量始终为大写字母,我们用“ _”分隔。和值不是字符串。

现在您需要配置package.json文件。在“脚本”中,我们通常具有启动,开发,测试脚本。开始是针对我们当前的开发环境的部署平台,测试进行测试以及开发。如果您使用的是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将给出错误。

答案 1 :(得分:0)

您已经在对密码进行哈希处理,因此不再需要明文形式的密码。为什么以后要全部存储明文密码?

为什么不只将哈希密码存储在您的代码中(由于不灵活,它可能不太好)或某些配置文件中? 除了introducing more risks以外,我看不到环境变量会给密码带来什么好处。

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

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

  • 将密码存储在密码管理器/安全位置(例如iOS钥匙串)
  • 使用在应用程序启动时输入的密码对密码进行加密,然后将加密的密码保存在应用程序的某些配置文件中
  • 使用密码短语加密密码,密码短语又存储在安全的位置(例如~/.ssh/目录,该目录仅供用户读取)。请注意,这只是安全的一小部分,但却提供了最大的舒适感