您好,我在搜索解决方案后仍未找到所需的帮助,
我想比较2个哈希密码和相同密码的bcrypt, 我该怎么做?
例如:
我有这两个哈希密码,它们来自bcrypt中的同一密码:
var password = E@Js#07Do=U$
var hash1 = $2a$10$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
var hash2 = $2a$10$mgApOcRIp7RSK3lRIIlQ5e/GjVFbxAFytGAEc0Bo17..r8v2pPR22
// that's not working for me
bcrypt.compare(passwordHash, userPasswordLoginHash, function(err, isMatch) {
if (err) throw err;
if(isMatch){
console.log('correct password!')
}
callback(null, isMatch);
});
我如何使用bcryptjs npm软件包来比较它们,以确定它们是否来自同一密码?
答案 0 :(得分:3)
这在设计上是不可能的-作为真正密码哈希的核心安全属性。
如果您可以在不知道原始密码的情况下比较两个密码哈希,那么如果攻击者破解了系统上的一个密码,他们将立即知道所有用户的密码使用该密码的用户,无需进行任何其他工作。显而易见,为什么这将是一件坏事。
例如,如果使用不适合密码存储的哈希值(例如MD5)存储密码,则所有密码都将具有相同的MD5哈希,并且破解其中的所有密码即可。
您不能使用bcrypt之类的现代密码哈希来做到这一点。 “比较”两个现代密码哈希的唯一方法是事先了解明文,然后在每个哈希中使用盐值应用该算法。即使两个用户使用相同的密码,攻击者也必须执行相同的昂贵计算才能独立破解每个用户。
通常来说-这听起来可能有点大胆-但是对于任何系统或管理员来说,永远比较两个用户的密码都没有合法的用例。用户密码一旦存储,就应该100%独立,并且对系统而言100%不透明。如果系统或业务案例需要进行这种比较,则应重新设计以消除该要求。
答案 1 :(得分:0)
使用bcrypt
lib,您可以将纯文本密码与使用相同lib哈希的密码进行比较。
说您对密码进行了哈希处理
const myPlaintextPassword = 'E@Js#07Do=U$'
bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
// Store hash in your password DB.
// example output, taking your hash
// hash = $2a$10$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
});
您进行比较:
// db query, get hashed password, found hash
// hash = $2a$10$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
// User input again:
const myPlaintextPassword = 'E@Js#07Do=U$'
bcrypt.compare(myPlaintextPassword, hash, function(err, res) {
// res is true as the original password is the same
// res == true
});
答案 2 :(得分:0)
“使用bcrypt lib,您可以将纯文本密码与使用相同lib哈希的密码进行比较。”
问题在于微服务架构,这是非常不安全的。如果我的前端将未加密的密码传递给后端,那么在将未加密的密码与系统后端数据库中的哈希值进行比较之前,将记录未加密的密码(可能在多个位置)。