哈希碰撞——密码哈希函数
Posted 来老铁干了这碗代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希碰撞——密码哈希函数相关的知识,希望对你有一定的参考价值。
解释
如果两个输入串的hash函数的值一样,则称这两个串是一个碰撞(Collision)。既然是把任意长度的字符串变成固定长度的字符串,所以必有一个输出串对应无穷多个输入串,碰撞是必然存在的。
一个优良的hash函数 f 应当满足以下三个条件:
(1)对于任意y,寻找x,使得f(x)=y,在计算上是不可行的。
解释:除了暴力,已知f(x),逆向找x是不可行的
(2)给定x1∈A,找x2∈B,,使得f(x1)=f(x2),在计算上是不可能的,这也就是弱无碰撞性。
举例:给定a, b发生了哈希碰撞,即当
a = b
时f(a) = f(b)
,那么,除了逐个遍历,我们无法得知a和b的值是多少
(3)寻找x1,x2,使得f(x1)=f(x2),在计算上也是不可行的,这也就是强无碰撞性。
解释:给定a, b发生了哈希碰撞,即当
a != b
时,f(a) != f(b)
,那么,除了逐个遍历,我们无法得知a和b的值是多少
这样就称为安全保密的Hash函数,也就是密码哈希函数的基础。 除了枚举外不可能有别的更快的方法。如第3条,根据生日定理,要想找到这样的x1,x2,理论上需要大约2^(n/2)的枚举次数。
因为前两条都能被破坏的hash函数太弱而被抛弃,几乎所有的hash函数的破解,都是指的破坏上面的第3条性质,即找到一个碰撞。在密码学上还有一个概念是理论破解,指的是提出一个算法,使得可以用低于理论值得枚举次数找到碰撞。
碰撞处理
通常有两类方法处理碰撞:开放寻址(Open Addressing)法和链接(Chaining)法。
前者是将所有结点均存放在散列表T[0…m-1]中;后者通常是把散列到同一槽中的所有元素放在一个链表中,而将此链表的头指针放在散列表T[0…m-1]中。
以上是关于哈希碰撞——密码哈希函数的主要内容,如果未能解决你的问题,请参考以下文章