我正试图使用bcryptjs生成用户密码的哈希值。但是,在一件事上我有点困惑。
根据这篇文章,传统上我们需要:
- 保持我们密码哈希的盐相对长和唯一,
- 用这个盐腌制用户密码后进行哈希,
- 同时存储搀着盐的哈希密码。
因此,当我们在验证用户时比较哈希值时,我们将存储的盐附加到用户输入的密码中,并将其与数据库中的哈希值进行比较。
然而,使用bcryptjs的hashSync和compareSync如下:
//hashSync to generate hash
var bcrypt = require('bcryptjs');
var password = "abc";
var hash = bcrypt.hashSync( <some string>, < integer length of salt>) // the salt of mentioned length(4-31) is self-generated which is random and fairly unique
//compareSYnc to compare hash
var testString="abc";
console.log(bcrypt.compareSync(testString, hash)) // compares with previously generated hash returns "true" in this case.
我困惑的是,如果我们在认证时不需要盐,那么生成它的意义是什么?compareSync 在没有访问盐的情况下返回 true。那么相对较小密码的暴力攻击不会变得更容易吗?无论盐的大小如何,以下所有内容都将返回 true:
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc"))); // consoles true. by default, if salt size is not mentioned, size is 10.
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 4))); //consoles true
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 8))); //consoles true
console.log(bcrypt.compareSync("abc", bcrypt.hashSync("abc", 32))); //consoles true
console.log(bcrypt.compareSync("ab", bcrypt.hashSync("abc", 4))); //consoles false
我希望我的困惑能够被解释清楚。