更新时间:2022-08-25 10:55
单向散列函数(也称杂凑函数、Hash函数)指的是根据输入消息计算后,输出固定长度数值的算法,输出数值也称为“散列值”或“消息摘要”,其长度通常在128~256位之间。
一个安全的杂凑函数应该至少满足以下几个条件:
①输入长度是任意的;
②输出长度是固定的,根据目前的计算技术应至少取128bits长,以便抵抗生日攻击;
③对每一个给定的输入,计算输出即杂凑值是很容易的;
④给定杂凑函数的描述,找到两个不同的输入消息杂凑到同一个值是计算上不可行的,或给定杂凑函数的描述和一个随机选择的消息,找到另一个与该消息不同的消息使得它们杂凑到同一个值是计算上不可行的。
单向散列函数的安全性是由于它的单向性,其输出不依赖于输入。平均而言,预映射值单个位的改变,将引起散列值中一半位的改变。已知一个散列值,要找到预映射的值,使它的散列值等于已知的散列值在计算上是不可行的。单向散列函数的安全性使它能用于完整性校验和提高数字签名的有效性。
常见散列函数(Hash函数)有:
在如今广泛使用的以太网中,报文的发送方会在以太网消息的末尾加上一个CRC(Cyclic Redundancy Check,循环冗余校验)字段,用来给接收方验证该消息的完整性,具体做法是:
1、消息发送方计算出消息的校验和并将其随消息一起发送。
2、接收方根据收到的消息重新计算校验和,并将其与直接收到的校验和相比较。如果两者不同,接收方就认为消息在传送过程中受损(如电信号受干扰出错),要求发送方重新发送。
这种方式被广泛使用到基于TCP/IP的多种通信协议中。大多数情况下,我们可以简单地将CRC看成是单向散列算法(函数)的一种应用。
经常在网站下载软件的人会留意这样一件事儿,在下载页面,网站会提供这个下载数据包的MD5值。这样的一个值就是网站使用MD5算法对下载的目标数据进行计算得到的一个散列值。如果攻击者攻破这个网站,在给用户下载的数据包中插入一些恶意代码或病毒,那么使用MD5算法计算得到的MD5散列值肯定发生了变化。
当这些被篡改的数据包被用户下载之后,用户只要执行MD5算法得到下载数据包的MD5散列值,与网站上公布的正常的MD5值对比。如果MD5值两者不同,表示正常的数据包被篡改了,就不要使用该数据包;如果两者一致,表示数据包没有被篡改,就能放心使用该数据包。
那么攻击者必须能调整代码的其他部分,使MD5的输出与以前相同。但MD5是专门为防止这种攻击而设计的,因此任何人下载了修改过的文件后,通过检查MD5散列值都将发现文件已不是原来的。