网址中的哈希值和字符串比较受php中的时间攻击?

时间:2014-04-03 23:10:46

标签: php security password-recovery

我在某种程度上审核了我的密码重置电子邮件系统的安全性。它是标准的,使用这样的电子邮件链接:

example.com/password-reset?code=Ik5S7eubvs79nxFCNx04Vdn5RNfb%2BUJRhC0khoHtuHU%3D

该代码urldecodes为bcrypt哈希值,该哈希值与请求密码重置时数据库中生成的哈希值匹配(并且到期超时为24小时)。

我认为这种方法非常标准,但是,请阅读有关该主题的文章: https://blog.jcoglan.com/2012/06/09/why-you-should-never-use-hash-functions-for-message-authentication/ ,作者提到在对两个字符串进行常规==比较时隐含的时间攻击,理论上任何此类比较都将被优化以逐字符检查并基于第一个不匹配字符拒绝。这样就可以让攻击者走路了#34;蛮力通过一根绳子最终建立一场比赛。这个实际上是否是php中的安全问题?

我猜测网络延迟和php中==操作的快速速度,这种时间攻击在简单的短字符串上实际上是不可能的,因为它总会被时间中的随机噪声掩盖接管网络。显然这个修复很短(比较哈希的哈希或类似的东西)对于我的情况,但我很感兴趣,如果这实际上是一个让我注意的实用问题。

1 个答案:

答案 0 :(得分:1)

我认为定时种子是一个糟糕的选择,即使你的哈希是短暂的并且与特定用户联系在一起。您需要假设您的源代码已被泄露(即使它不是)。我改用openssl_random_pseudo_bytes()。您还应该限制用户要求重置密码的能力(例如,每天/每周不超过一次/等)。