Hash 为什么SlowEquals函数对于比较散列密码很重要?

Hash 为什么SlowEquals函数对于比较散列密码很重要?,hash,cryptography,Hash,Cryptography,我最近读了一篇文章,其中解释(在“SlowEquals代码如何工作?”)必须使用SlowEquals函数来比较输入密码的散列与数据库中密码的散列 据我所知,之所以使用SlowEquals函数,是因为它使用XOR而不是==,因此将检查两个字符串中的每个字符,而不是第一个不匹配的字符 有两件事我不明白: 为什么XOR会在达到失败条件后继续检查字符串 如果主要目的是在试图破解密码时不向攻击者提供任何有用的信息,那么具有随机生成时间的sleep()函数不就可以很好地解决问题吗 算法比较两个散列的所有字节

我最近读了一篇文章,其中解释(在“SlowEquals代码如何工作?”)必须使用SlowEquals函数来比较输入密码的散列与数据库中密码的散列

据我所知,之所以使用SlowEquals函数,是因为它使用XOR而不是==,因此将检查两个字符串中的每个字符,而不是第一个不匹配的字符

有两件事我不明白:

  • 为什么XOR会在达到失败条件后继续检查字符串
  • 如果主要目的是在试图破解密码时不向攻击者提供任何有用的信息,那么具有随机生成时间的sleep()函数不就可以很好地解决问题吗

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

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


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

    TL;DR-在比较密码哈希时,使用SlowEquals并不重要

    如果您试图验证一个非散列的秘密,那么使用“SlowEquals”将有助于阻止定时攻击

    然而,如果您使用的是一个适当的密码散列,它的计算强度足够大(PBKDF2,50k+次迭代),那么这并不重要。为什么?因为密码散列“假定违反”。即使攻击者窃取/知道散列和salt,找到散列到该值的明文密码也太耗时,因此密码仍然受到保护。这就是加密散列的全部意义,即使被盗,它们也无法使用。当然,有人可以使用定时攻击来找出散列,但这并不重要,因为他们仍然无法找出密码


    再加上锁定功能,在X次无效尝试(3-10次,由你选择)后帐户被锁定,对散列密码的定时攻击从一文不值变成毫无疑问的一文不值

    如果没有慢质量

    让我们考虑一下,计算机使用2秒来比较两个字符(在真实计算中更快,但是大量的测试可以工作),并且我们使用1234554321作为密码。 攻击者使用0000000000进行尝试。因为我们不使用slowEquals函数,比较只需要2秒,因为0=1.


    因此,当攻击者知道“2秒”时,他会将“0”更改为另一个,直到使用“100000000”,然后服务器需要4秒。

    Iridium很好地解释了这个问题。SlowEquals可用于阻止基于时间的侧通道攻击。增加额外延迟的问题在于,统计数据能够消除任何恒定的时间延迟。此外,它还可以用来消除任何随时间变化而恒定的延迟(!),因此在0到10秒之间添加一个完全随机的延迟将平均为5秒的延迟。假设一个成功的比较需要0.1秒,一个不太成功的比较需要0.05秒,那么你只需做1000次相同的比较,如果平均需要5.1秒,你猜对了。统计是一个婊子:)1)SlowEquals是一个坏名声。它是否慢并不重要,只要它是恒定的时间。典型的实现相当快。2) 这里没那么重要。恒定时间比较对于MAC验证非常重要。security.se的相关问题由于我们在比较哈希,比较失败的字符的信息有多重要?我想这取决于攻击者是发送散列还是未加密的密码。哦,没关系,上面的CodeInChaos链接解决了这个问题!这是不准确的,因为慢速比较可以防止定时攻击,而不会防止密码窃取。这并不准确,他说,在处理散列密码时,基于字符串比较猜测密码的定时攻击不起作用,如果您知道散列是如何工作的,这是有意义的。