大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说node.js学习笔记之密码存储的加密-bcryptjs,希望您对编程的造诣更进一步.
bcrypt
为什么不使用MD5加密?
MD5属于通用型的哈希算法,设计出来的目的是在短时间内尽可能的计算大量的数据,这意味着它们在确保数据完整性方面使用较为出色;以及当你不想使用原本的数据进行比较的时候,这些算法得到的数据进行比较会比较好。但是在密码存储方面则不够安全。
一台现代计算机每秒可以计算330MB MD5散列。如果用户使用的密码都是小写字母并且只有6个字符的长度,你可以在大约40秒内尝试每个可能的密码。因此,使用以上的方式在数据当中存储密码并不安全,激活成功教程的难度也不高。而在bcrypt5个数量积的情况下需要12年的时间。
为什么使用bcrypt?
首先,bcrypt很慢。它使用了一种变体Blowfish加密算法的键控表,并引入了一个工作因子,它允许您确定哈希函数的开销有多大。正因为如此,bcrypt可以跟上摩尔定律。当计算机变得更快时,您可以增加工作因子,而散列将变得更慢。
bcrypt比MD5慢多少?取决于工作因子。使用工作因子为12的bcrypt,在我的笔记本电脑上大约0.3秒内就可以将密码yaaa散列。另一方面,MD5只需要不到一微秒的时间。
同时,bcrypt是单向Hash加密算法,不可反向激活成功教程生成密码明文。
在node.js中如何使用bcrypt
安装
npm i bcryptjs
使用
//引入bcrypt包
const bcrypt = require('bcryptjs');
const {promisify} = require('util');
//分析时间消耗
const {performance} = require('perf_hooks');
//同步版本
function bcryptHashSync(myPlaintextPassword,cost){
let salt = bcrypt.genSaltSync(cost);
let hash = bcrypt.hashSync(myPlaintextPassword, salt);
return hash;
}
//每一次生成的hash都会不一样
let password = bcryptHashSync('yaaa',10);
console.log(password);//$2a$10$8j0o8ixPI967DEd3KwfeN.qBKQ6KHAzgTEJR0/yMcTP/ZthBpf3GK
//同步的形式验证密码
console.log(bcrypt.compareSync('yaaa',password));//true
//异步函数版本
async function bcryptHash(myPlaintextPassword,cost){
const start = performance.now();
//将有回调函数的API转换成promise形式再转成同步API的形式,将返回值赋值给前面的变量
const salt = await promisify(bcrypt.genSalt)(cost);
const mid = performance.now();
const hash = await promisify(bcrypt.hash)(myPlaintextPassword,salt);
const end = performance.now();
console.log(hash);
}
//通常使用的工作因子cost是10
bcryptHash('Lzzhchc/*c.ds',10);
//Lzzhchc/!*c.ds 10
// $2a$10$YNDBR9HIIGM7W35lL3m0d.SyC7PUEoiEHOTTwP.3p6XamtMlJ56/S 76.01820003986359 175.74580001831055 249.9683000445366
const hash = '$2a$10$YNDBR9HIIGM7W35lL3m0d.SyC7PUEoiEHOTTwP.3p6XamtMlJ56/S';
//验证,在拿之前生成的hash进行验证也可以得到正确结果
bcrypt.compare('Lzzhchc/!*c.ds',hash,(err,result) => {
console.log(result);
});
通常bcrypt得到的hash的格式介绍
加密过程的介绍
- cost代表hash杂凑的次数,数值越大,生成的salt-随机字符串复杂度越高,生成哈希的时间越长,被激活成功教程的难度也越高。
- 单向加密,通过多次salt和cost的处理,使得被暴力激活成功教程的难度大大提升
- 加密得到的字符串的格式介绍
如何比对明文和通过加密得到的hash是否对应着同一个密码
bcrypt.compareSync(passward,hash);
- 拿到hash值中的salt-随机字符串值
- 对明文密码-password进行加密。并且将从hash值中拿到的salt值添加到最后加密过程中使用的salt值
- 将现在加密过后得到的hash值和原本传入的hash值进行对比,相等返回true,否则返回false
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13799.html