在 Node.js Web 开发中,我认为使用 bcrypt
进行密码哈希和比较是一种常见的做法。bcrypt.compare
容易受到定时攻击吗?
原始帖子:
这取决于你正在使用的bcrypt模块的实现。 bcrypt本身只是一个关键的派生函数,并没有指示应该如何进行比较。理论上,将哈希与朴素字符串进行比较===
比较的bcrypt.compare
函数可能会泄漏有关哈希的信息。
但是,假设您指的是 Node.js 中使用最广泛的 bcrypt
模块,则bcrypt.compare
函数是使用时序安全CompareStrings
函数实现的。此函数始终在中断之前比较哈希中的所有字符,这可以防止它显示比较失败的位置/时间。
重要更新:
上面喜欢的bcrypt.compare函数不再是定时安全的,但是这已经在各个地方进行了讨论(例如这里和这里),共识似乎是这无关紧要,因为bcrypt本身不容易受到定时攻击:
加密哈希函数的所需属性之一是原像攻击抗性,这意味着没有捷径生成一条消息,该消息在经过哈希处理时会生成特定的摘要。