2016012026 管凌波
散列函数的应用及其安全性
一、散列函数是什么。
散列函数即为Hash函数,就是把任意长度的输入(预映射),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
因此,一个“好”的Hash函数具有这样的特点:对于大的输入集合使用该函数,产生的输出结果均匀分布且看起来随机。Hash函数的首要目标是保证数据完整性。
在密码学中,Hash函数主要用于校验数据的完整性,即用来判断数据是否被篡改过。密码学Hash函数要求如下两种情况在计算上不可行。(即没有攻击方法比穷举攻击更有效):(a)对预先指定的Hash值找到对应的数据块(单向性);(b)找到两个不同的数据块对应相同的Hash值(抗碰撞性)。
二、散列函数的具体应用。
密码学Hash函数应用广泛,它或许是用途最多的密码算法。各种不同的安全应用和网络协议都有它活跃的身影。
(1) 消息认证
消息认证是一种用来验证消息完整性的一种机制或服务。消息认证确保受到的数据确实和发送时的一样(即没有修改、插入、删除或重放)。此外,通常还要求消息认证机制确保发送方声称的身份是真实有效的。当Hash函数用于提供消息认证功能时,Hash函数值通常称为消息摘要。
消息认证中使用Hash函数的本质如下:发送者根据待发送的消息使用该函数计算一组Hash值,然后将Hash值和消息一起发送过去。接收者收到后对于消息执行同样的Hash计算,并将结果与收到的Hash值进行对比。如果不匹配,则接收者推断出消息(当然也可能是Hash值)受到了篡改。
Hash码可以通过多种不同方法提供消息认证:
a. 使用对称密码算法加密消息和Hash码。
b. 使用对称算法只对Hash码进行加密。
c. 不使用加密算法,仅使用Hash函数也能够实现消息认证。
d. 通过将整个消息和Hash值加密,能够在c的基础上提供保密性。
一般来说,消息认证是通过消息认证码(MAC)实现的,即带密钥的Hash函数。MAC从总体来看是Hash函数与加密函数的集合,更加高效安全。
(2)数字签名
Hash函数另一个重要应用为数字签名。数字签名与MAC相似,在进行数字签名过程中使用用户的私钥加密消息的MAC值,其他任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性。在这种情况下,攻击者要想篡改消息,则需要知道用户的私钥。数字签名的应用比消息认证更加广泛。
Hash码提供数字签名的方案:
使用发送方的密钥 ,利用公钥密码算法仅对Hash码进行加密。这种方法可提供认证;由于只有发送方可以产生加密后的Hash码,所以这种方法也提供了数字签名,这就是数字签名本质所在。
若既希望保证保密性又希望有数字签名,则先用发送方的私钥对Hash码加密,再用对称密码中的密钥对消息和公钥算法加密结果进行加密,这种技术比较常用。
(3)其他应用。
a 基于其的单向性常被用于产生单向口令文件。操作系统存储口令的Hash值而非其本身。这样当黑客访问口令文件时就不能获得真正口令。当用户输入口令时,操作系统将对比输入口令的Hash值和存储在口令文件中的Hash值。在多数操作系统中都使用了这种口令机制。
b Hash函数可用来入侵检测和病毒检测。将每个文件的Hash值H(F)存储在安全系统中(如CD-R中),随后就能够通过重新计算H(F)来判断文件是否被修改过。入侵者只能改变F,而不能改变H(F)。
c 密码学Hash函数能够用于构建随机函数(PRF)。基于Hash函数的PRF可用于对称密码中的密钥产生。
d 可用做伪随机数发生器(PRNG)
三、结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。
1.散列函数的安全性:
如上文所言,Hash函数的安全性体现在数据完整性上。
散列函数的目的是文件、消息或者其他数据块产生“指纹”。为满足在消息认证中的应用,散列函数H必须具有下列性质:
(1)H可适用于任意长度的数据块。
(2)H能够生成固定长度的输出。
(3)对于任意给定的x,计算H(x)相对容易,并且可以用软/硬件实现。
(4)对于任意给定的h,找到满足H(x)=h的x在计算上不可行,满足这一特性的散列函数称之为:具备抗原像攻击性。
(5)对于任意给定的数据块x,找到满足H(y)=H(x)的y ≠ x在计算上是不可行;满足这一特性的散列函数称之为:抗弱碰撞性。
(6)找到满足H(x) = H(y)的任意一对(x,y)在计算上是不可行的。满足这一特性的散列函数称之为:抗碰撞性。
前三个性质是使用散列函数进行消息认证的实际可行要求。第四个属性,抗原像攻击,防止攻击者能够回复秘密值。抗弱碰撞性保证了对于给定的消息,不可能找到具有相同散列值的可替换消息。满足上面前5个性质的散列函数称之为弱散列函数。如果还满足第6个性质则称之为强散列函数。
Hash函数的安全性很大程度上取决于抗强碰撞的能力。
2.生日攻击:
生日攻击是利用概率论中的生日问题,找到冲突的Hash值,伪造报文,使身份验证算法失效。假设人数为输入值,一年的天数为哈希值的位数,当输入值大于365时,必有重复的映射。由此可以看出,产生哈希冲突所需的输入样本数量,远低于所有可能哈希值的全集数量。在生日攻击中,即使输入较少的输入值,也有很大几率获得多个相同的输出值,即发生哈希碰撞。避免哈希碰撞,需要将哈希位数设置成足够多的位数。
3. 2004、2005年王晓云教授有关MD5安全性:
MD5是一个在国内外有着广泛的应用的Hash函数算法,它曾一度被认为是非常安全的。王小云教授带领她的小组在2004年发布了发现完整MD5算法的碰撞的报告。这是一种主动碰撞破解Hash函数的方式,说明MD5是可以通过主动方法破解的。这意味着,当你在网络上使用电子签名签署一份合同后,还可能找到另外一份具有相同签名但内容迥异的合同,这样两份合同的真伪性便无从辨别。王小云教授的研究成果证实了利用MD5算法的碰撞可以严重威胁信息系统安全,这一发现使目前电子签名的法律效力和技术体系受到挑战。
4.2017年google公司SHA-1的安全性:
Google发布了哈希函数SHA-1的 哈希碰撞实例。SHA-1是1995年国家标准技术局NIST于1995年标准化的哈希函数。与MD5相比,SHA-1的输出长度更长,这也意味着出现哈希碰撞的概率更低SHA-1的安全性比MD5更好。SHA-1也广泛用于数字签名,与其他散列一样,SHA-1还将任何输入消息转换为长字符串的数字和字母,用作该特定消息的加密指纹。当针对两个不同的消息产生相同的散列值(指纹)时,出现冲突攻击,然后可以利用它们来伪造数字签名,从而允许攻击者中断使用SHA-1编码的通信。说明这个比前辈更加安全的算法也不再那么安全了。
5. 目前安全散列函数的发展:
目前的安全散列函数MD5,SHA-1仍为被大量使用的算法。在SHA-1被Google宣布被破解后,随着显卡的不断进步发展,SHA-1的破解也许也不需要太大难度。未来可能会产生更多复杂的散列函数。
四、结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问题。
MD5算法是一种摘要算法,它可以从多个字节组成的串中计算出由32个字节构成的“特征串”。对于超过32字节的串来说,MD5计算得出的值必然是其一个子集,所以必然存在两个(或更多)不同的串能够得出相同MD5值的情况。这种情况就叫做MD5碰撞。
构造前缀碰撞法可制作两个内容不同但具有相同MD5验证码的文件。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
前缀碰撞,以同一个给定的前缀程序A为基础,在尾部添加不同的附加数据,得到两个具有相同MD5的样本B和C。前缀构造法碰撞后的两个样本只有尾部少量字节不同,而程序代码是相同的。通过判断尾部数据的差异,两个样本可以执行不同的程序流程。这种碰撞手法是通过同一前缀程序碰撞生成两个样本。
但是,在使用MD5算法来验证完整性时,由于MD5算法是公开的,所有人都可以获得和使用MD5算法,那就意味着别人可以利用相同的算法针对你的加密值不断地进行计算。如果不对MD5算法进行一些处理,那么当我们将自己的重要接口暴露在互联网上的时候,比如登陆接口,攻击者就可以同样利用MD5加密算法对我们进行撞库攻击和关键信息比对。为了避免这个问题,我们可以给算法增加一个偏移量,比如在原始数据上拼接一段数据在进行加密;或者根据原始数据分布范围进行转换,用得到的新值进行MD5计算,这样子被破解的风险就会大大降低。