确切地说,对于哈希函数
h,有三种可以执行的“攻击”:
预像攻击:给定一个“输出” y(正确大小的比特序列,例如 MD5 的 128 比特),找到一个消息 m(任意比特序列)使得 h(m) = y。
第二预像攻击:给定一个消息 m,找到另一个消息 m',并且与 m 不同,使得 h(m) = h(m')。
碰撞攻击:找到两条消息 m 和 m',它们彼此不同,并且满足 h(m) = h(m')。
一种好的哈希函数是一种在最佳情况下能够抵御这三种攻击的函数。那么这个最佳情况是什么呢?它取决于哈希输出大小 n。
考虑一种理论上完美的哈希函数,由一个黑盒组成;在盒子里有一个小矮人、一些骰子和一本大书。当询问一个给定输入消息的哈希值时,小矮人使用骰子生成一个随机输出,并将其返回。但他还会在他的大书中写入消息和输出。如果再次询问相同消息的哈希值,那么他将会返回先前的相同值。这个设置被理论家称为一个 随机预言机。随机预言机从不自相矛盾,但在精确问题(和输入消息)被问到之前,您无法知道它将对给定问题回答什么。
如果随机预言机输出长度为 n 比特的字符串,则可以在时间 O(2n) 内找到预像和第二预像,在时间 O(2n/2) 内找到碰撞。这里所说的时间是以请求随机预言机为基础的。抵御预像攻击很容易理解:攻击者只需尝试消息,直到纯粹的运气使预言机输出期望值;他无法做得更好,因为即使小矮人也不知道他会得到任何新输入的信息。由于预言机的均匀随机性质,期望尝试次数为 2n。 对于第二预像攻击的抵御同理。对于碰撞,这与所谓的 生日悖论 有关。
如果哈希函数的抵抗力似乎与随机预言机的抵抗一致,那么它就被认为是安全的。 它不能更好;我们要求它也不会更糟。
当某人提出一种方法来寻找预像、第二预像或与随机神谕上的通用方法成功率更高的碰撞时,哈希函数就被称为“破解”。SHA-1被认为已经被破解,因为发现了一种成本约为2^61的寻找碰撞的方法(SHA-1具有160位输出,因此应该抵抗工作因子约为2^80的碰撞)。请注意,完整的方法未运行,即我们没有实际的碰撞。2^61仍然非常高,在可行范围内(需要数千台机器,运行数月或数年)。但是2^61比2^80小五十万倍,所以这是一个突破。
有时,“破解”是以荒谬的代价发现的(例如,理论抵抗力为2^168的代价为2^112的攻击)。我们称之为“学术性”突破:比预期的抵抗力快,但仍然可以通过地球技术完全撤消。
请注意,并非所有哈希函数的用途都依赖于抵抗碰撞。实际上,大多数用途都依赖于抵抗预像或第二预像。对于那些攻击,SHA-1目前像新的一样好,具有2^160的抵抗力。
相反,即使是具有128位输出的完美哈希函数也应被视为弱点,至少对于碰撞抵抗:通用攻击,工作因子为2^64,处于技术可行范围之内。这就是为什么新的哈希标准使用更大的输出(例如,SHA-2从224位输出开始)。足够大的输出可以击败通用攻击。