hash - 为什么 SlowEquals 函数对于比较哈希密码很重要?

标签 hash cryptography

我最近读了一篇关于password hashing and salting的文章其中解释了(在“SlowEquals 代码如何工作?”下)必须使用 SlowEquals 函数来比较输入的密码的哈希值与数据库中密码的哈希值。

据我了解,使用 SlowEquals 函数是因为它使用 XOR 而不是 ==,因此将检查两个字符串中的每个字符,而不是在第一个不匹配的字符上失败。

有两件事我不明白:

  1. 为什么 XOR 会在达到失败条件后继续检查字符串。
  2. 如果主要想法是在尝试破解密码时不向攻击者提供任何有用的信息,那么具有随机生成时间的 sleep() 函数难道不能很好地实现这一目的吗?

最佳答案

该算法比较两个散列的所有字节的事实只是实现的结果,与 XOR 的使用无关(即,可以编写一个算法来比较所有字节,而不会在第一次不匹配时中断,即使使用==)。使用 XOR 的目的是避免在循环体中引入分支指令,这可能会揭示有关 CPU 分支预测结果的匹配字节数的详细信息(尽管这是否是一个问题在某种程度上取决于特定的实现) ,以及它编译后的指令)。

使用随机 sleep() 来屏蔽在第一次不匹配时返回的哈希检查的时间并不能真正起作用,因为通过获取更多样本仍然可以在给定点区分匹配和不匹配。为了便于论证,如果我们假设我们 sleep 了均匀分布在 [0..100] 范围内的随机毫秒数,并且某个位置的匹配需要 2 毫秒,而该位置的不匹配只需要 1 毫秒(如算法所示)提早退出)。通过足够的采样,我们可以区分匹配和不匹配的情况,因为我们会观察到不匹配情况下的响应范围为 [1..101]ms,但匹配情况下的响应范围为 [2..102]ms(假设我们可以完美地计时响应) 。当然,现实世界的观察会受到抖动和其他随机性来源的影响,但仍然可能会观察到偏差。

当然,还有一个简单的实际考虑 - 当相对较小的修改应该导致它以恒定时间运行并消除定时攻击时,为什么要引休眠眠、随机等?

关于hash - 为什么 SlowEquals 函数对于比较哈希密码很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21100985/

相关文章:

perl - 使用 Perl 将一个散列插入另一个散列

perl - 对嵌套哈希的哈希键进行排序

jquery:点击时删除 URL 片段

python - 如何使用 m2crypto 在非 SSL 设置中验证 X509 证书链

ruby - 如何按值对哈希数组进行排序?

javascript - 在 Firefox 中使用 jQuery 持续加载 "AJAX"URL

c++ - 分析 C++ rand()

java - 在 Java 中为 AES 生成随机 IV

Java RSA 加密不可重复?

c# - CngKey System.Security.Cryptography.CryptographicException 系统找不到 Azure 上指定的文件