哈希碰撞是个什么鬼?

什么是哈希算法?

哈希算法,也叫哈希函数,散列函数,是将任意长度的二进制值映射为较短的固定长度的二进制值,即哈希值。哈希算法是一种只能加密,不能解密的特殊算法。

什么是哈希碰撞?

如果不同的输入得到了同一个哈希值,就发生了"哈希碰撞"(collision)。

如何防止哈希碰撞?

哈希碰撞的概率取决于两个因素(假设哈希函数是可靠的,每个值的生成概率都相同)。取值空间的大小(即哈希值的长度)和整个生命周期中,哈希值的计算次数,所以最有效的方法是扩大哈希值的取值空间。
哈希碰撞的概率公式:推导过程
在这里插入图片描述d为取值空间,n为计算次数

更长的哈希值意味着更大的存储空间、更多的计算,将影响性能和成本。开发者必须做出抉择,在安全与成本之间找到平衡。

生日攻击

这个问题在数学上早有原型,叫做"生日问题"(birthday problem):一个班级需要有多少人,才能保证每个同学的生日都不一样?

答案很出人意料。如果至少两个同学生日相同的概率不超过5%,那么这个班只能有7个人。事实上,一个23人的班级有50%的概率,至少两个同学生日相同;50人班级有97%的概率,70人的班级则是99.9%的概率。

这意味着,如果哈希值的取值空间是365,只要计算23个哈希值,就有50%的可能产生碰撞。这是一个近似公式
在这里插入图片描述
这个公式可以算出,50% 的哈希碰撞概率所需要的计算次数,N 表示哈希的取值空间。生日问题的 N 就是365,算出来是 23.9。这个公式告诉我们,哈希碰撞所需耗费的计算次数,跟取值空间的平方根是一个数量级

这种利用哈希空间不足够大,而制造碰撞的攻击方法,就被称为生日攻击(birthday attack)。

你可能感兴趣的:(算法和数据结构)