散列函数及其应用
散列函数
散列,英文Hash,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的信息摘要的函数。
散列函数的应用
在算法竞赛中,我所接触到的主要有字符串hash用于把字符串“索引”为一个值,然后对复杂字符串进行操作,来加快遍历速度,降低算法复杂度。把字符串匹配转移到了值匹配。但是散列函数属于一种“概率型算法”,对于模的取值有一定概率出现碰撞。所以在算法竞赛中不常使用,或者要多次测验避免碰撞。
在信息安全方面的应用主要体现在以下的3个方面:
1)文件校验
我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
2)数字签名
Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
3)鉴权协议
如下的鉴权协议又被称作"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。
散列函数的安全性
两个不同的输入,经过哈希算法后,得到了同样的哈希值,就叫做哈希碰撞。由于通常的哈希算法中,哈希值的空间远小于输入的空间,这就意味着信息熵有丢失。一个空间较大的集合(输入)通过哈希算法映射到一个空间较小的集合(哈希值),必然会造成多个输入映射到一个哈希值上,这就是所谓的哈希碰撞。而这个也就是在算法竞赛中很少使用字符串哈希和值哈希的原因。
而因为哈希碰撞的原因,也就有了对散列函数进行攻击的方法。
1、生日攻击
生日攻击是以概率论中的生日问题为数据基础的一种密码学攻击方法。根据生日悖论,如果哈希值的位数过短,很容易可以找到一组(两个)哈希值相同的输入,这就是一种最常用的生日攻击的应用。使用一个64位的哈希函数,大约有 1.8 × 10^19 个不同的哈希值。如果产生每个哈希值的可能性是相同的,那么只需大约 5.1 x 10^9 次(51亿次)暴力尝试就可以得到一次哈希碰撞。
2、王晓云破解MD5。
MD5最大的问题在于,通过我国的王晓云教授等学者的工作,md5已经被证明可以进行碰撞攻击。也就是说,攻击者可以产生两个应用程序,内容不一样,但是哈希值完全一样。
安全散列函数的发展
1、目前,已经出现了SHA-3,但是还是采用的是SHA-2。之所以全世界没有迁移到SHA-3,首要原因是世界上目前几乎没有任何软件或硬件支持该算法。
2、前量子计算算法的Grover算法和Shor算法已经可以破译当今广泛使用的密码。Shor算法是一种量子计算机求解离散对数问题的算法,它能够攻破RSA、DSA和ECDSA密码,Grover算法没有Shor算法有效,它的作用相当于把密码的秘钥长度减少一半,密码技术人员可以通过加长秘钥长度来抵抗Grpver算法攻击。
值得注意的是,国外的量子计算机发展迅速,已有像谷歌这样的著名公司将量子计算机投入使用,用于提高信息搜索效率和研究量子人工智能。如今的量子计算机还不足以通过执行Shor算法或Grover算法来大肆攻击现有密码。
3、MD5 和 SHA1 是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。MD4(RFC 1320)是 MIT 的Ronald L. Rivest在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32位操作数的位操作来实现的。
md5算法的相关问题
md5算法的选择前缀可以在使用相同前缀的情况下更改少部分内容仍能使两个文件得到相同的md5,而第二个链接中两个内容不同的exe文件却有着相同的md5,为md5的不安全性提供了实例,在王晓云教授研究结果的基础上,密码学研究者已经研究出了改进版本“构造前缀碰撞法”,并且编写出了快速MD5碰撞生成器,使MD5的破解速度可以达到几秒钟这样的速度。
故用md5算法验证软件完整性会出现如下的问题:
(1)不能确保得到的软件是否被修改过或者被替换
(2)不能确保得到的软件中间被人获取过
(3)在软件过大时,会使验证时间过长而导致攻击者的成功率增加