我正在使用 bcrypt 来生成盐和散列密码,但我认为它不是很安全。 当我使用以下代码时:
bcrypt.genSalt(10, function(err, salt) {
user.salt = salt;
bcrypt.hash(password, salt, function(err, hash) {
user.hashed_password = hash;
console.log(user.salt);
console.log(user.hashed_password);
user.save(function(err) {
if (err) console.log(err);
console.log("saved");
});
});
});
在一个示例中,salt 是:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMO
,hashed_password 是:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMOVnlv9cKgAFdCQ5xdtlP6UoKz90i1FMu
散列密码的开头与盐完全相同。如果攻击者可以访问 salt,他不能直接从 hashed_password 中删除 salt 并使用暴力或使用预先确定的哈希值表来确定密码吗?
我一直认为这应该是散列密码的顺序:
hash(salt + password)
不是:
salt + hash(password)
最佳答案
散列密码的开头是盐,因为您需要访问盐以验证密码。
你看到的数据既不是 hash (salt + password) 也不是 salt + hash(password) -- 它的形式是
salt + hash(salt + password)
如果攻击者获得了对这些数据的访问权,那么:
- 他们当然可以(理论上)暴力破解密码——没有任何技术可以阻止这种情况,但速率限制使攻击变得不切实际。此实例中使用的哈希函数经过专门设计,需要很长时间才能运行,从而间接限制攻击速率。
- 他们不能使用标准的散列表来找出密码——这是因为散列值也包含唯一的盐。当然,盐是明文存在的,因此可以计算出一个表,但由于盐对于每个散列密码也是唯一的,这并不比暴力攻击好多少。
关于javascript - Bcrypt 在散列密码时不那么安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717073/