📜  当数据库中的密码存储在 Node.js 中以散列形式存储时,如何使用原始密码登录?(1)

📅  最后修改于: 2023-12-03 15:09:51.243000             🧑  作者: Mango

Node.js中如何使用原始密码登录

简介

密码散列化是一种常用的安全实践,用于将用户密码存储在数据库中。散列化可以减少用户密码泄露的风险,因为即使攻击者窃取了数据库,也无法直接获取密码明文。当用户尝试登录时,他们输入的密码将与存储在数据库中的散列值进行比较。

这篇文章将介绍如何在 Node.js 中存储密码并使用原始密码进行登录。我们将使用bcrypt-nodejs,它是一个广泛使用的密码散列库。在散列密码存储时,需要注意一些安全配置,我们也将介绍这些配置。

安装bcrypt-nodejs

首先,让我们安装bcrypt-nodejs:

npm install bcrypt-nodejs
散列密码

在将密码存储到数据库中之前,我们需要将其散列化。bcrypt-nodejs是一个简单易用的散列库,提供了生成散列密码的方法。以下是一个示例:

const bcrypt = require('bcrypt-nodejs')

const password = 'myPassword123'
const salt = bcrypt.genSaltSync(10)
const hash = bcrypt.hashSync(password, salt)

console.log(hash) // $2a$10$sIRH112GcYXvu03f1jOcyeZw29AmraQF1FdKslNV/RoKjCJ6VzU6a

如上所示,我们首先生成一个salt,然后将其传递给bcrypt.hashSync()方法,以便生成散列密码。

验证密码

接下来,我们将看到如何使用bcrypt-nodejs检查给定密码是否与存储在数据库中的散列值匹配。

const bcrypt = require('bcrypt-nodejs')

const password = 'myPassword123'
const hashedPassword = '$2a$10$sIRH112GcYXvu03f1jOcyeZw29AmraQF1FdKslNV/RoKjCJ6VzU6a'

bcrypt.compare(password, hashedPassword, (err, res) => {
  console.log(res) // true
})

如上所示,我们将使用bcrypt.compare()方法检查原始密码是否与散列后的密码匹配。

安全配置

在使用bcrypt-nodejs时,需要注意几个安全配置。以下是一些最佳实践:

  • 创建一个强大的salt:生成一个适当复杂的salt可增加密码破解的难度。
  • 设置散列迭代次数:增加迭代次数可减缓攻击者用于破解密码的尝试次数。推荐使用10-14作为迭代次数。
  • 循环等待时间的自动递增:如果散列计算需要一段时间,该库将自动递增等待时间以增加攻击者的计算成本。

以下是使用bcrypt-nodejs实现加强安全配置的示例:

const bcrypt = require('bcrypt-nodejs')

const password = 'myPassword123'
const salt = bcrypt.genSaltSync(12)
const hash = bcrypt.hashSync(password, salt)

console.log(hash) // $2a$12$qZPOBvTzdVeiPE.0dqN2e.GyA/9J6VzU6a

bcrypt.compare(password, hash, (err, res) => {
  console.log(res) // true
})

如上所示,我们将salt的迭代次数增加到12,并自动递增等待时间。

结论

在Node.js中实现密码散列化是一项非常重要的安全实践。使用bcrypt-nodejs简化了该过程,并提供了一些方便的安全配置。我们希望本文能够帮助您了解如何在Node.js中存储密码并使用原始密码登录。