哈希碰撞——密码哈希函数

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 = bf(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]中。

以上是关于哈希碰撞——密码哈希函数的主要内容,如果未能解决你的问题,请参考以下文章

哈希算法达到密码学安全需要什么

一区块链技术与应用-密码学原理

密码学大事件! SHA-1 哈希碰撞实例

哈希加密算法

PHP哈希表碰撞攻击

[转帖] 阮一峰:哈希碰撞与生日攻击