📌  相关文章
📜  如何在节点 js 中对密码进行哈希处理 - Javascript (1)

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

如何在 Node.js 中对密码进行哈希处理

介绍

在 Web 应用程序中存储密码时,为了加强安全性,一般不直接存储明文密码,而是将其哈希或加密之后存储。哈希是一种不可逆的算法,它将原始数据转换成固定长度的数据,不同输入的哈希值不同,使得黑客难以从哈希值反推出原始密码。

Node.js 提供了多种哈希算法,例如 SHA256、SHA512、bcrypt 等,本文将介绍如何使用常见的 bcrypt 模块对密码进行哈希处理。

安装 bcrypt

首先,需要安装 bcrypt 模块。可以使用 npm 命令进行安装:

npm install bcrypt
生成哈希值

使用 bcrypt 模块中提供的 hash 函数可以生成哈希值。以下是一个生成密码哈希值的例子:

const bcrypt = require('bcrypt');
const saltRounds = 10;  // 定义盐的强度,默认为 10
const myPassword = 'myPassword123';  // 原始密码

bcrypt.hash(myPassword, saltRounds, (err, hash) => {
  if (err) {
    console.error(err);
  }
  console.log(hash);  // 生成的哈希值
});

代码解释:

  • const bcrypt = require('bcrypt'); 引入 bcrypt 模块
  • const saltRounds = 10; 定义盐的强度为 10,盐是一个随机的额外字符串,会和原始密码一起哈希存储,增强密码安全性。
  • const myPassword = 'myPassword123'; 定义原始密码
  • bcrypt.hash(myPassword, saltRounds, (err, hash) => { 调用 hash 函数,传入原始密码和盐的强度,异步生成哈希值,调用回调函数。
  • if (err) {...} 检查是否有错误,如有则输出错误信息。
  • console.log(hash); 输出生成的哈希值。

生成的哈希值类似于 $2b$10$IyR7OrDr2xH9e7.cuBtZmulh05Tsueb848n37KKLS5Y2KYCJzMLnG,它包含三个部分:

  • $2b$ 表示使用的哈希算法,其中数字 2b 表示 bcrypt 版本号;
  • 10 表示盐的强度;
  • IyR7OrDr2xH9e7.cuBtZmu 是生成的哈希值。
校验密码

校验密码时,将用户输入的密码与存储的哈希值进行对比即可。使用 bcrypt 模块中提供的 compare 函数进行对比。以下是一个校验密码的例子:

const bcrypt = require('bcrypt');
const hashedPassword = '$2b$10$NvHCmZXZVz3BlmYuO7fzHuZwRquVaRzOJQ9mgFVH119tOFM8V7bLO';  // 从存储中获取的密码哈希值
const myPassword = 'myPassword123';  // 用户输入的密码

bcrypt.compare(myPassword, hashedPassword, (err, result) => {
  if (err) {
    console.error(err);
  }
  console.log(result);  // true/false
});

代码解释:

  • const hashedPassword = '$2b$10$NvHCmZXZVz3BlmYuO7fzHuZwRquVaRzOJQ9mgFVH119tOFM8V7bLO'; 从存储中获取的密码哈希值,此处为示例,实际应用中需要从数据库或文件中获取。
  • const myPassword = 'myPassword123'; 用户输入的密码。
  • bcrypt.compare(myPassword, hashedPassword, (err, result) => { 调用 compare 函数,传入用户输入的密码和存储的哈希值,异步进行校验,调用回调函数。
  • if (err) {...} 检查是否有错误,如有则输出错误信息。
  • console.log(result); 输出校验结果,值为 true 表示密码相同,值为 false 表示密码不同。
小结

本文介绍了在 Node.js 中使用 bcrypt 对密码进行哈希处理的方法。通过示例代码,让程序员们更好地了解了密码哈希的原理和实现方式。在实际应用中,为了保证密码的安全性,建议使用更加复杂的密码加盐存储,以降低黑客破解密码的难度。