9

我正在尝试使用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

我希望我能清楚地解释我的困惑。

4

1 回答 1

10

bcrypt标准使存储盐变得容易 - 检查密码所需的一切都存储在输出字符串中。

影子密码文件中哈希字符串中的前缀“$2a$”或“2y”表示哈希字符串是模块化密码格式的 bcrypt 哈希。哈希字符串的其余部分包括成本参数、128 位盐(base-64 编码为 22 个字符)和 192 位 [dubious – Discussion] 哈希值(base-64 编码为 31 个字符)。

那来自bcrypt 上的维基百科页面

于 2015-01-02T06:38:29.653 回答