在用户模块,对于用户密码的保护,通常都会进行加密然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。目前,MD5和BCrypt比较流行。
BCrypt是单向Hash加密算法,一般用于密码加密,相对来说,BCrypt比MD5更安全 ,但是MD5加密会更快速。 MD5是一种可反向破解的密码加密,如果你的密文被截获它就可以在MD5在线解密破解得到密码,然后就可以根据你的账号密码登录账号。而Bcrypt类似Pbkdf2算法不可反向破解生成明文(不可逆加密),所以即使黑客截获到密文也无法转换成明文(BCrypt不支持反运算, 只支持密码校验)。虽然不能转换成明文密码,但是它还是会被彩虹破解,只是相对于破解时间来说两者差别巨大,如果非要举例说明一下,用彩虹破解MD5可能需要3分钟左右,而BCrypt就需要14年之久。所以一般都推荐使用bcrypt。
BCrypt加密原理:输入的明文密码通过10次循环加盐后得到myHash(版本+salt),然后存入数据库。系统在验证用户的口令时,需要从myHash中取出salt跟password进行hash;得到的结果保存在DB中的hash进行比对,如果一致才算验证通过。
加密
const mongoose = require('../db');
const LoginSchame = new mongoose.Schema({
image:String,
nickname:String,
phone:String,
password:{
type:String,
set (val) {
//hashSync()第一个参数为需要加密的内容,第二个参数是加密后的字段
return require('bcryptjs').hashSync(val, 10)
}
},
});
const LoginModel = mongoose.model('login', LoginSchame, 'login');
module.exports = { LoginModel };
解密
前两个参数分别是数据库中的密码和要验证的密码,第三个参数是个回调函数,主要用来验证密码是否匹配。
// 进行密码比较
bcrypt.compareSync(password, PasswordHash, (err, isMatch) => {
if (err) {
// 如果比较过程中出现错误,则处理错误
console.error('Error comparing passwords:', err);
} else if (isMatch) {
// 如果密码匹配,则进行后续操作
console.log('Password is match.');
} else {
// 如果密码不匹配,则进行后续操作
console.log('Password is not match.');
}
});
或者。。。
// 进行密码比较
if (!bcrypt.compareSync(password, PasswordHash)) {
return res.send({
code:501,
msg:"密码错误"
})
}
okla!!!