Node.js 为什么compareSync不需要盐字符串?

Node.js 为什么compareSync不需要盐字符串?,node.js,hash,salt,bcrypt,saltedhash,Node.js,Hash,Salt,Bcrypt,Saltedhash,我正在尝试使用生成用户密码的哈希。但是有一件事我有点困惑 按照惯例,根据第条,我们需要: 保持密码哈希的盐相对较长且唯一 散列用此盐腌制的用户密码 将salt散列密码与salt一起存储 因此,当我们在验证用户时比较散列时,我们将存储的salt附加到用户输入的密码中,并将其与数据库中的散列进行比较 但是,使用hashSync和compareSync的如下所示: //hashSync to generate hash var bcrypt = require('bcryptjs'); var p

我正在尝试使用生成用户密码的哈希。但是有一件事我有点困惑

按照惯例,根据第条,我们需要:

  • 保持密码哈希的盐相对较长且唯一
  • 散列用此盐腌制的用户密码
  • 将salt散列密码与salt一起存储
因此,当我们在验证用户时比较散列时,我们将存储的salt附加到用户输入的密码中,并将其与数据库中的散列进行比较

但是,使用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.

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

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

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


这是从。

我对salt的理解,正如我在上面的文章中提到的,它也连接到原始密码,因此即使很短的密码也很难用暴力破解。例如:若密码是“a”,salt是32个字符长,那个么对33个字符执行bruteforce,对吗?但是使用bcrypt,如果不存储salt,则匹配任何原始字符,而不管salt的长度。就像第一次尝试“a”一样,不管盐的长度如何,它都是真的。那么,如果bcrypt中没有存储salt,那么除了停止彩虹表和反向查找表攻击之外,它还有什么用呢?@Pravin散列1个字符的密码和33个字符的密码之间的区别是最小的,甚至是零。盐被存储——它只是存储在包含散列的同一个字符串中。盐只能防止彩虹桌攻击。这就是他们的目的。
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