使用BCrypt加密,让你更安全的储存密码_懒得安分的博客-程序员宅基地

技术标签: 数据安全  node  加密  开发技巧  bcrypt  

BCrypt是后端加密存储的解决方案,流程是:

请求传入后端
得到明文密码
使用BCrypt加密得到hash
存入数据库
返回结果

验密流程:

请求传入后端
得到明文密码
数据库取出对应hash
使用BCrypt验证
返回结果

使用方法

  1. 安装
npm install bcrypt
  1. 使用
// 引入BCrypt模块
const bcrypt = require('bcrypt');
// 定义加密密码计算强度
const saltRounds = 10;
// 明文密码
const myPlaintextPassword = 'abc123456';
const someOtherPlaintextPassword = 'not_bacon';

下面两种方法是一样的加密效果

// 加密方法1(调用单独的函数生成盐和hash)
bcrypt.genSalt(saltRounds, function(err, salt) {
    
    bcrypt.hash(myPlaintextPassword, salt, function(err, hash) {
    
        // 数据库存入hash
    });
});

// 加密方法2(自动生成盐和hash)
bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
    
    // 数据库存入hash
});

验密

// 从数据库得到hash
bcrypt.compare(myPlaintextPassword, hash, function(err, result) {
    
    // result == true
});
bcrypt.compare(someOtherPlaintextPassword, hash, function(err, result) {
    
    // result == false
});

更多方法可以参考官方文档

注意

  • saltRounds 表示密码加密的计算强度,从1级到10级,强度越高,密码越复杂,计算时间也越长。 值得注意的是,强度为1-3时强度太低,系统会默认使用强度为10的计算方式进行加密!
  • 每个bcrypt的执行,只使用字符串的前72个字节。匹配密码时忽略任何额外的字节。请注意,这不是前72个字符。字符串可以包含少于72个字符,同时占用超过72个字节(例如,包含Emojis的UTF-8编码的字符串)。

为什么不推荐使用MD5, SHA1, SHA2, SHA3等?

这些都是通用的hash,旨在用尽可能短的时间计算大量数据的摘要。这意味着它们可以用来很好的确保数据的完整性。

而当今服务器能够计算大约每秒330MB的MD5hash,如果你的用户使用6位的小写字母和数字做为密码,则你可以在40秒内测试该条件的每一种可能!而且相当于没有任何花费!!如果你花2000美刀和一周时间搭建一个小型超级计算机集群,这将让你尝试大约每秒700,000,000个密码,而且速度还会每秒向上增加!!!

盐没有多大帮助

盐对于防范字典攻击或蛮力攻击是无效的,你可以使用巨大的盐和很多穿插的盐,但它不会影响攻击者的破解速度,因为你的数据库中有hash和盐。
是否使用盐,只要使用的是专为速度而生的通用hash,那么上面的破解就会有效

用BCrypt解决这些问题

它太慢了!使用一种变体的Blowfish加密算法的密钥时间表并引入work factor,允许设定hash的复杂程度,让BCrypt可以跟上摩尔定律。还可以增加work factor,将hash变慢。
所以,这不是每40秒破解一次的密码,而是大约12年一次!你的密码可能不需要这种安全性,但是bcrypt允许您选择速度和安全性的平衡点。use it.

参考文章:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaoxiaohai0000/article/details/119102875

智能推荐

随便推点