简短版本:如果盐对攻击者隐藏,我认为对密码的加盐哈希进行快捷比较是没有危险的。
长版:
在这种情况下使用定时攻击绝不会告诉攻击者更多,如果他有实际存储的哈希和盐......并且应该选择 brypt 的安全参数(迭代计数指数),即使知道哈希和salt 不会给攻击者足够大的优势来获取密码(因为他必须从中暴力破解密码)。
另一方面,如果攻击者既不知道使用的盐也不知道存储的哈希,我猜想比较计算和存储的哈希的时间根本不会给出任何信息,因为密码输入将导致完全不同的哈希值。(这适用于每个伪随机函数,不仅是 bcrypt。我们实际上只需要这里的雪崩效应。)请参阅下面的更正式的详细说明。
除此之外,通常哈希过程本身包含在测量中,这比最后的最终比较花费的时间要长得多,因此将支配总测量时间。不过,我不知道这个哈希时间会有多少变化。
数学版:
现在我的问题是这是否可以转化为“比蛮力”攻击?是否存在增量攻击的可能性,即除了使用暴力猜测之外,是否可以从具有 n 个正确位的密码构造具有 n+1 个正确位的密码?
所以我们有一个函数c_h(y)
,它是H(s, y)
和之间匹配的前导位数h
。设m
为 H 输出的总位数。
假设我们有一个算法 A 可以进行攻击,即,对于散列h
(A 未知)和给定消息x
,c_h(x) = n
找到具有 的消息x'
的算法c_h(x) >= n+1
,在时间上优于指数 in n
。(简单的暴力破解哈希是 的指数n
。)我们可以假设这个算法有 O(1) 的 oracle 访问c_h(y)
任意的y
。
然后我们可以从这个构造一个算法B,它将对给定的哈希和盐进行原像攻击,即找到一条消息。它的工作原理如下:h
s
z
H(s,z) = h
- A 的预言只需通过计算
H(s,y)
并与 比较来完成,计算h
正确的位直到第一个不匹配。
- 我们任意选择一条消息
x_0
,计算一下n_0 = c_h(x_0)
。
- 对于每个 i > 0:
- 我们传递
x_(i-1)
给 A,然后返回x_i
。n_i = c_h(x_i) > n_(i-1)
- 如果
n_i = m
,停止并返回z = x_i
。
B 的输出是 的原像(s, h)
。
由于每个n_i
都比前一个大,这将最多m
通过循环,每次通过最多o(exp(n_i))
时间,即总共o(exp(m))
。因此我们得到了一个次指数的原像查找算法。
这表明,假设H
是抗原像的,那么在给定匹配长度作为预言机的情况下,不可能有一种算法可以有效地从较短的部分匹配中产生较长的部分匹配。
(我假设可以更好地改进我的时序近似值。)
关于评论的注释:
由于评论线程越来越长,我将尝试在这里恢复重点:
使用弱密码,对密码哈希的离线字典攻击将变得可行,这将是我们的算法B。这就是为什么我们要选择足够高的 bcrypt 工作因子。
尽管如此,我仍然认为无法从快速B(使用给定盐的离线原像攻击)算法到快速A(来自哈希前缀长度 oracle 的在线部分原像查找器)算法,只能反过来。
我希望即使对于原像损坏的功能,只要它们仍然符合雪崩标准,也没有简单的方法来获得我们的在线攻击。
现实生活中的散列函数并不是真正随机的(这是由它们的迭代设计引起的),但这并不会真正影响它们对密码散列的适用性,密码散列适用于小于块大小的输入。
这里的重要特性是抗原像性,而不是抗碰撞性。(每个抗碰撞功能都是抗第二原像的,并且抗第二原像的功能是抗原像的——尽管我们通常期望对(第二)原像攻击的抵抗力比这种减少碰撞抗性所给出的更高的抵抗力,因为通用生日攻击发现碰撞。)这意味着只要没有原像攻击,这个证明就适用于 MD5(在碰撞方面被破坏)。
上面的证明不依赖哈希函数是一个随机预言机,它只是使用预言机访问c_h(y)
,它抽象了