赞
踩
bcrypt是一个跨平台的文件加密工具,使用的是布鲁斯·施内尔在1993年发布的 Blowfish 加密算法。
Bcrypt生成的密文是60位的,并且不会想MD5那样重复
这些都是通用的hash,旨在用尽可能短的时间计算大量数据的摘要。这意味着它们可以用来很好的确保数据的完整性。
而当今服务器能够计算大约每秒330MB的MD5hash,如果你的用户使用6位的小写字母和数字做为密码,则你可以在40秒内测试该条件的每一种可能!而且相当于没有任何花费!!如果你花2000美刀和一周时间搭建一个小型超级计算机集群,这将让你尝试大约每秒700,000,000个密码,而且速度还会每秒向上增加!!!
盐对于防范字典攻击或蛮力攻击是无效的,你可以使用巨大的盐和很多穿插的盐,但它不会影响攻击者的破解速度,因为你的数据库中有hash和盐。
是否使用盐,只要使用的是专为速度而生的通用hash,那么上面的破解就会有效
它太慢了!使用一种变体的Blowfish加密算法的密钥时间表并引入work factor,允许设定hash的复杂程度,让BCrypt可以跟上摩尔定律。还可以增加work factor,将hash变慢。
所以,这不是每40秒破解一次的密码,而是大约12年一次!你的密码可能不需要这种安全性,但是bcrypt允许您选择速度和安全性的平衡点。use it.
验密流程:
npm install bcrypt
// 引入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编码的字符串)。
参考文章:
- How To Safely Store A Password:https://codahale.com/how-to-safely-store-a-password/
- 使用bcrypt进行加密的简单实现:https://www.cnblogs.com/wx1993/p/5250275.html
- bcrypt的简单使用:https://blog.csdn.net/xiexingxi/article/details/77188370
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。