什么是Hash函数?
的有关信息介绍如下:首先介绍下Hash函数
Hash函数(也称散列函数或散列算法)的输入为任意长度的消息,而输出为某一固定长度的消息,即Hash函数是一种将任意长度的消息串M映射成为一个定长消息的函数,记为H。称h=H(M)为消息M的Hash值或消息摘要,有时也称为消息的指纹。通常Hash函数应用于数字签名、消息完整性检查等方面。
设H是一个Hash函数,x是任意长度的二元串,相应的消息摘要为y=H(x),通常消息摘要是一个相对较短的二元串。假设我们已经计算出了y的值,那么如果有人改变了x的值为xˊ,则通过计算消息摘要yˊ=H(xˊ),验证yˊ与y不相等就可以知道原来的消息x已被改变。
通常,Hash函数可以分为两类:不带密钥的Hash函数和带密钥的Hash函数。不带密钥的Hash函数只需要有一个消息输入;带密钥的Hash函数规定要有两个不同的输入,即一个消息和一个密钥。
Hash函数的目的是为指定的消息产生一个消息“指纹”,Hash函数通常具有以下这些性质:
攻击者可以对Hash函数发起两种攻击。第一种是找出一个xˊ,使得H(x)= H(xˊ)。例如,在一个使用Hash函数的签名方案中,假设s是签名者对消息x的一个有效签名,s=sig(H(x))。攻击者可能会寻找一个与x不同的消息xˊ,使得H(x)= H(xˊ)。如果找得到,则攻击者就可以伪造对消息xˊ的签名,这事因为s也是对消息xˊ的有效签名。Hash函数的弱无碰撞性可以抵抗这种攻击。
攻击者还可以发起另一种攻击,同样一个应用Hash函数的签名方案中,对手可能会寻找两个不同的消息x和xˊ,使得H(x)= H(xˊ),然后说服签名者对消息x签名,得到s=sig(H(x))。由于s=sig(H(xˊ)),所以攻击者得到了一个对消息xˊ的有效签名。Hash函数的强无碰撞性可以抵抗这种攻击。
Hash函数的另一种常见的攻击方法是生日攻击,感兴趣的读者可以参阅参考文献中生日攻击的的相关资料。为防止生日攻击,通常的方法就是增加Hash值的比特长度,一般最小的可接受长度为128位。常见的Hash函数,如MD5和SHA分别具有128比特和160比特的消息摘要。