原始帖子:
这取决于您使用的bcrypt模块的实现。bcrypt本身只是一个key derivation function,并不表示应该如何进行比较。理论上,一个将哈希值与天真的字符串===
比较的bcrypt.compare
函数可能会泄漏有关哈希值的信息。
然而,假设您指的是Node.js最广泛使用的bcrypt
模块,那么bcrypt.compare
函数是使用一个时间安全的CompareStrings
函数来实现的。该函数在中断之前始终比较哈希中的所有字符,从而防止泄露比较失败的位置/时间。
重要更新:
上面提到的bcrypt.compare函数不再是时间安全的,然而这已经在各个地方(例如这里和这里)讨论过了,并且共识似乎是这并不重要,因为bcrypt本身不容易受到时间攻击的影响:
加密哈希函数的一个期望属性是预像攻击的抵抗力,也就是说没有快捷方法可以生成一个消息,使得当对其进行哈希时产生特定的摘要。