1.什么是哈希碰撞?产生哈希碰撞的原因是什么?如何避免?
两个不同的输入,经过哈希算法后,得到了同样的哈希值,就叫做哈希碰撞。由于通常的哈希算法中,哈希值的空间远小于输入的空间,这就意味着信息熵有丢失。一个空间较大的集合(输入)通过哈希算法映射到一个空间较小的集合(哈希值),必然会造成多个输入映射到一个哈希值上,这就是所谓的哈希碰撞。这就是说当输入的可能性被完全枚举时,一定会产生哈希碰撞。
避免哈希碰撞的主要手段是,根据输入集合的数量级,选取输出合适哈希值长度的哈希函数,将哈希碰撞的概率降为“几乎不可能”。
2.什么是生日悖论?及计算过程。
生日悖论:如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。对于60人以上,这种概率要大于99%。70人为99%,严格意义上,这并不是一个悖论,称之为悖论是由于跟人们的常识相悖。
所以所有人生日都不相同的概率是:
那么,n个人中有至少两个人生日相同的概率就是:
所以当n=23的时候,概率为0.507;当n=100的时候,概率为0.999999692751072。在哈希算法中,将人数对应为输入样本数量,将一年365天对应为哈希值的位数。
3.生日攻击
所以由生日悖论结论可以看出来:产生哈希冲突所需的输入样本数量,远低于所有可能哈希值的全集数量。
这就引出了生日攻击。生日攻击不是真实的一个攻击,而是一种概率的结果。生日攻击是以概率论中的生日问题为数据基础的一种密码学攻击方法。使用一个64位的哈希函数,大约有 1.8 × 10^19 个不同的哈希值。如果产生每个哈希值的可能性是相同的,那么只需大约 5.1 x 10^9 次(51亿次)暴力尝试就可以得到一次哈希碰撞。51亿次叫做birthday bound (生日边界)。
4.生日攻击的结论
由于是属于暴力穷举的一种,所以它能对任何类型的散列函数进行攻击。
根据生日悖论(公式推导略),n位的哈希值预计产生一次碰撞需要2^(n/2)次尝试。