【玩转Node.js】让你的服务端不在存储明文密码——bcrypt模块

1,028 阅读2分钟

古之立大事者,不唯有超世之才,亦必有坚韧不拔之志 ——苏轼

写在前面

在写服务端的时候,经常会遇到存储存储密码的业务逻辑,如果我们的数据库存储的是明文密码的话,将会非常的不安全,bcrypt 模块帮你解决这个问题。

bcrypt 模块概述

bcrypt,是一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。

采用的加密使用是单线程的,也就是说仅仅可以加密而不能解密,在加密的过程中可以生成随机的字符串来增加密码的难度

使用步骤

// 导入bcrypt模块
const bcrypt = require('bcrypt');
// 生成随机字符串 gen => generate 生成 salt 码
let salt = await bcrypt.genSalt(10);
// 使用随机字符串对密码进行加密
let pass = await bcrypt.hash('明文密码', salt);

密码对采用如下代码

// 密码比对
let isEqual = await bcrypt.compare('明文密码', '加密密码');

安装步骤

在通过 npm 命令安装 bcrypt 之前,我们需要先安装其依赖环境:

  1. Python 2.X

  2. node-gyp

    命令

    npm install -g node-gyp
    
  3. windows-build-tools

    命令

    npm install --global --production windows-build-tools
    
  4. 安装 bcrypt 第三方模块

    命令

    npm i bcrypt
    

完整示例代码

// 导入 bcrypt
const bcrypt = require('bcrypt')


async function run() {
  /* 
    生产一个随机的字符串
    使用 bcrypt.genSalt() 方法
    该方法接受一个数值作为参数
      * 数值越大,生成的随机字符串复杂度就越高
      * 数值越小,生成的随机字符串复杂度就越低
    默认值为 10
    返回随机生成的字符串
  */
  const salt = await bcrypt.genSalt(10);
  /* 
    使用 bcrypt.hash() 方法对密码进行加密
    参数:
      * 1. 要进行加密的明文
      * 2. 随机字符串
    返回值是加密后的密码
  */
  const result = await bcrypt.hash('123456', salt)
  console.log(salt);
  console.log(result);
  /* 
    使用 bcrypt.compare() 方法进行密码的校对
    参数:
      * 明文密码
      * 加密后的密码
    返回一个布尔值
  */
  let isEqual = await bcrypt.compare('123456', result);
  console.log(isEqual); // true
}

run()