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

Node.js-在env变量中存储密码,node.js,config,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(ad

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

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”:“十五个adminPassword”}

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

const admin=新管理员({
用户名:“管理员”,
密码:config.get(“adminPassword”)
});


最后,我设置了env变量
export\u adminPassword=12345
,但在进行身份验证时,该变量作为无效密码失败

我以前用过config软件包,但我头疼得厉害。因此,我切换到env cmd包。以下是您应该如何实施:

npm install env-cmd
然后在根文件夹中创建一个/config目录。在其中创建一个dev.env文件。在这里输入变量,如下所示

/config/dev.env

PORT=3000
ADMIN_PASSWORD=fifteeen_adminpassword
请注意,对于命名约定,env变量始终是大写字母,我们用“\u1”分隔它们。值不是字符串

现在需要配置package.json文件。在“脚本”中,我们通常有开始、开发和测试脚本。start适用于部署平台,test适用于测试,dev适用于我们当前的开发环境。如果您使用的是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”更改为

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

const admin = new Admin({
        username: "admin",
        password: process.env.ADMIN_PASSWORD
      });
请注意,将项目部署到github时,必须将配置文件夹名称添加到.gitignore文件中。所以你的密码或api密钥不会公开


同样,每次向dev.env kill终端进程添加新变量并重新启动它时。mongodb将给出错误消息

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

为什么不将散列密码存储在代码中(这可能不是很好,因为它不灵活)或某个配置文件中? 我看不出环境变量会给代码中添加密码带来什么好处,除了

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

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

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

您是否已验证
config.get(“adminPassword”)
是否返回预期结果?是否有可能是
未定义的
config
实现是什么样子的?如何检查
config.get(“adminPassword”)
返回的内容?
config
实现看起来像我在我的原始帖子中解释的,我还有其他属性,但它们与这个问题无关,这就是为什么我没有包括它们。你可以调试你的解决方案并检查值,或者你可以简单地
console.log(config.get(“adminPassword”)
。嗯,它返回“1212345”,这不是我在环境变量中设置的密码。所以为了覆盖它,我运行了导出密码=12345
。我这样做了,现在它在控制台中返回12345,但当我尝试进行身份验证时,仍然会出现无效密码错误……好的,这更接近了一步:)管理员用户创建是否正常?密码加密有问题吗?
const admin = new Admin({
        username: "admin",
        password: process.env.ADMIN_PASSWORD
      });