node使用bcrypt进行密码加密

713 阅读2分钟

前言

在项目中使用bcrypt来完成密码加密的时候,对里面的有些方法不是很清楚。然后在学习的时候发现很多文章对于这个方面并不是很好的讲解,然后就想记录下自己解决和思考的过程。

使用方法

在node使用bcrypt的话,首先得安装这个这个bcrypt库,然后在项目中导入。

在进行密码加密的时候得通过bcrypt.hash方法来将密码加密,这个函数得传递两个个参数,第一个参数是需要加密的字符串密码,第二个是需要指定加密的复杂度,默认是10,这个不是越高越好,因为这会影响你加密和比较的速度,对性能不友好。

然后,如果你是需要比较或者看当前的密码是否和数据库的密码相同时,得需要bcrypt.compare方法来比较,需要传递两个参数,一个是明文,第二个是加密的密码或者说是加密的数据。

// 加密密码
let password = await bcrypt.hash(password, 5)
// 比较加密的密码和前端传来的明文密码
let isTheSame = await bcrypt.compare(body.password, user.password)

总结下使用方法:

  • bcrypt.hash 加密密码 (明文,复杂度) 返回加密字符串
  • bcrypt.compare 比较加密的数据是否相等 (明文,加密数据) 返回布尔值

有些文章,会使用bcrypt.hashAsync和bcrypt.compareAsync这两个方法,对此我很疑问,这两个方法和我们上面说到的有什么不同?

其实不同点在于hash和compare这两个方法是异步的,而上面那两个是同步的,所以优先使用上面的会比较好。

对加密的理解

在解决怎么用,我就很好奇这是怎么加密我们的数据或者比较加密的数据呢?

其实 bcrypt加密密码=BCrypt版本号+salt盐(22位)+myHash(password和盐salt进行hash),我们在hash的时候,每次生成的salt是不一样的,然后这就导致我们的密码不容易被破解。而且这种方法是不可逆的。

那怎么用明文和我们的加密的密码比较?

其实简单理解就是我们hash的加密数据中包含了salt,然后我们只要取出这个字段的数值和我们传递的明文进行组合,如果这个组合起来的数值和我们的加密密码相等,那么就可以判断出来了,这个明文就是加密前的传进去的明文。