散列函数的应用及安全性
目录:
一、散列函数的具体应用;
二、散列函数的安全性以及目前安全散列函数的发展;
三、md5算法来验证软件完整性时可能出现的问题。
一、散列函数的具体应用:
密码学中,Hash函数被广泛应用于各种不同的安全应用和网络协议中。
1. 消息认证
消息认证是用来验证消息完整性的一种机制和服务。消息认证确保收到的消息和发送时的一样的(即没有修改、插入、删除或重放)。通常还要求消息认证机制确保发送方声称的身份是真实有效的,当Hash函数用于提供消息认证功能时,被称为消息摘要。
应用消息认证时,发送者根据待发送的消息使用该函数计算一组Hash值,然后将Hash值和消息一起发送过去。接收者收到后对于消息执行同样Hash计算,并将结果与收到的Hash值进行对比。如果不匹配,则接收者推断出消息(或Hash值)遭到了篡改。但是假如hash值和消息同时遭到了篡改,接收者是不知情的。这要求我们要以安全的方式传输hash值。
2. 数字签名
数字签名的操作与MAC相似,在进行数字签名过程中使用用户的私钥加密消息的Hash值,其他人任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性。数字签名的应用比消息认证更为广泛。
3. 文件校验
譬如奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
4. 鉴权协议
需要鉴权的一方,向被鉴权的一方发送随机串(“挑战”),被鉴权方将该随机串和自己的鉴权口令字一起进行 Hash 运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行 Hash 运算的结果相比较(“认证”),如相同,则可在统计上认为对方拥有该口令字,即通过鉴权。
5. 邮件相关
保密增强邮件 PEM(Privacy Enhanced Mail),因特网保密性增强邮件标准,提供的消息完整性检查中的鉴别使用的单项散列函数MD2和MD5;邮件加密软件PGP 中2.6.3版本中使用的单项散列函数是MD5。
6. 产生单向口令文件。操作系统存储口令的Hash值而不是口令本身,当用户输入口令时,操作系统将比对输入口令的Hash值和存储在口令文件中的Hash值(大多操作系统的口令保护机制)。
二、结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。
1.生日攻击
(是利用概率论中的生日问题,找到冲突的Hash值,伪造报文,使身份验证算法失效。
什么是生日问题呢?在一个教室中最少只需有23个多少学生就可以使至少有两个学生的生日在同一天的概率不小于1/2。
同理,对应到散列函数中,很少的输入值就会有很大的可能使两个输出值完全相同。这无疑是不安全的。
2. 防范方法
- 使用安全的Hash算法:安全的Hash算法生成的Hash值有足够多的位数。这样,攻击者在寻找两个具有相同Hash值的文件时就会非常困难。
- 加盐:在为文件签名之前,先向文件添加一个随机值,然后计算Hash值,再将文件、签名和随机值一起发送给接收者。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
- 改动文件:在为文件签名之前,对消息或文件做少许改动。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
3. MD5安全性和SHA-1的安全性
Van Oorschot和Wiener曾经提出,花费1000万美元涉及一个被专门用来搜索MD5算法碰撞的机器,则平均24天内就可以找到一个碰撞。2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。
在2017年,Google公司宣布实现了对SHA-1算法的攻击。SHA-1算法宣告攻破。
4. 散列函数的安全性
(1)通过对于生日攻击的了解,散列函数的安全性是有待提高的。生日攻击并没有利用任何HASH函数的性质,是对任何HASH都适用的普适的攻击方法,应对方法也很简单,增加HASH的长度,但是很难完成。
(2)有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。
5.目前安全散列函数的发展
MD系列
(1)MD2 Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。
(2)MD4 MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。通过三圈的操作将任意长度的消息变换成128位的哈希值。
(3)MD5 Rivest于1991年对MD4的改进版本。运用了四轮变换,并且每轮加上前一轮的结果。
(4)HAVAL 为MD5的改进版本。轮数可以为3、4或5,输出长度分别为128、160、192或224位。
SHA系列
2005年MD5的攻破似乎宣告了SHA或许为仅存的安全散列算法。
(1)SHA-0:SHA由美国标准与技术研究所(NIST)设计并于1993年发表,该版本称为SHA-0,由于很快被发现存在安全隐患,
(2)SHA-1:1995年发布了SHA-1。
(3)SHA-2:2002年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称SHA-2。2008年又新增了SHA-224。
(4)由于2017年SHA-1算法的攻破,目前已经有多家科技企业宣布逐步放弃SHA-1算法,微软已经确定会放弃在Edge以及IE浏览器上继续使用SHA-1算法的TLS证书,Google的Chrome在56版之后也会提示SHA-1加密的HTTPS网页并不安全,Mozilla则确定在今年7月开始停止SHA-1的支持。目前SHA-2各版本已成为主流。
三.结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法来验证软件完整性时可能出现的问题。
1. MD5和SHA-1:
MD5和SHA-1算法的核心是哈希函数。密码学哈希函数(Cryptography Hash Function,简称为哈希函数)又称杂凑函数,是在信息安全领域有广泛和重要应用的密码算法,主要作用是数据完整性验证和消息认证。它有一种类似于指纹的应用,所以有时候我们也把它叫做“数字指纹”。因为它具有以下特性:原始信息只要改变一点点,哪怕是几比特,对应的消息摘要也会改变很大。
MD5算法的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
SHA-1已经被公众密码社群做了非常严密的检验而还没发现到有不安全的地方,它在一段时间被认为是安全的,直到2017年,Google宣布攻破SHA-1。
几位密码学家使用 “构造前缀碰撞法”(chosen-prefix collisions)来进行攻击(是王小云所使用的攻击方法的改进版本),他们所使用的计算机是一台Sony PS3,且仅用了不到两天。如果仅仅是想要生成MD5 相同而内容不同的文件的话,在任何主流配置的电脑上用几秒钟就可以完成。
结论:MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。
2. 选择前缀碰撞及第二个链接中的实验
构造前缀碰撞法可制作两个内容不同但具有相同MD5验证码的文件,这是王小云教授所使用的攻击方法的改进版本
现在,如果仅仅是想要生成 MD5 相同而内容不同的文件的话,在任何主流配置的电脑上用几秒钟就可以完成了。
3. MD5验证软件完整性时可能出现的问题
(1)当软件过大时,在验证过程中所需的时间也会大大增加,对于第三方而言,攻击的成功概率也会增加。
(2)不能通过校验MD5知道网站是否被入侵篡改,是否曾被恶意植入病毒或木马/后门。
(3)如果有第三方在验证软件完整性时截取软件代码,使用快速MD5碰撞生成器,在短时间内伪造一份相同的MD5,并恶意篡改软件,那么安全性将会大大下降。