第五次作业:散列函数安全性的知识扩展
散列函数的应用及其安全性
一、给出散列函数的具体应用
答:
①消息认证:是用来验证消息完整性的一种机制或服务,确保收到的数据确实和发送时的一样(没有修改、插入、删除或重放),通常还要求信息认证机制确保发送方声称的身份是真实有效的
消息认证中使用Hash函数的本质:发送者根据待发送的信息使用该函数计算一组Hash值,然后将Hash值和消息一起发送过去。接收者收到后对信息执行同样的Hash计算,并将结果与收到的Hash值进行对比,如果不匹配,则接收者推断出信息遭受到篡改
Hash函数用于消息认证的方法:
·使用对称密码算法加密消息和Hash码
·使用对称密码算法只对Hash码进行加密
·不使用加密算法,仅使用Hash函数也能够实现消息认证
·通过将整个消息和Hash值加密
②数字签名:就是附加在数据单元上的一些数据或是对数据单元所作的密码交换,在进行数据签名过程中使用用户的私钥加密信息的Hash值,其他任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性
Hash码用于提供数字签名的方案
·使用发送方的私钥,利用公钥密码算法仅对Hash码进行加密
·先用发送方的私钥对Hash码加密,再用对称密码中密钥对信息和公钥算法加密结果进行加密
③其他应用
·用于产生单向口令文件:当用户输入口令时,操作系统将对比输入口令的Hash值和存储在口令文件中的Hash值
·用于入侵检查和病毒检测:将每个文件的Hash值H(F)存储在安全系统中,然后就能够通过重新计算H(F)来判断文件是否被修改过,入侵者只能够改变F,而不能够改变H(F)
·用于构建随机函数(PRF)或用作伪随机数发生器(PRNG)
(2)结合生日攻击、2004、2005年王晓云教授有关MD5安全性以及2017年Google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展
答:
生日悖论是指,如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。这就意味着在一个典型的标准小学班级(30人)中,存在两人生日相同的可能性更高。对于60或者更多的人,这种概率要大于99%。从引起逻辑矛盾的角度来说生日悖论并不是一种悖论,从这个数学事实与一般直觉相抵触的意义上,它才称得上是一个悖论。大多数人会认为,23人中有2人生日相同的概率应该远远小于50%。
总结起来,生日悖论的本质就是,随着元素增多,出现重复元素的概率会以惊人速度增长
生日攻击就是利用散列函数发生碰撞的可能性,进行n次尝试直到找到一对碰撞的输入。一个40比特长的消息摘要是很不安全的,大约一百万次随机Hash可至少以50%的概率找到一个碰撞。
生日攻击是利用概率论中的生日问题,找到冲突的Hash值,伪造报文,使身份验证算法失效。
生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度
生日攻击对散列函数的要求:
·生日攻击决定了一个仅依赖于散列值的集合大小的散列函数的必要安全条件,即消息摘要必须足够长
·它意味着安全的消息散列的长度有一个下限(一般建议最小长度为128bit)
MD5:用于保证信息传输完整一致,让大容量信息在用数字签名软件签署私人密钥前被“压缩”成一种保密的格式
特点:
·压缩性:任意长度的数据,算出的MD5值长度都是固定的
·容易计算:从元数据计算出MD5的值很容易
·抗修改性:对元数据进行人和改动,哪怕是只修改一个字节,所得到的MD5值都有很大的区别
·强抗碰撞性:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的
但在2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。(注意:并非是真正的破解,只是加速了杂凑冲撞)
安全Hash函数SHA-1:主要用于数字签名标准里面定义的数字签名算法。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
特性:
·不可以从信息摘要中复原信息
·两个不同的信息不会产生同样的信息摘要
但在2017.02.23,Google宣布了SHA-1算法碰撞方法,攻破SHA-1算法。
散列函数的安全性要求:
(1)H可适用于任意长度的数据块
(2)H能够生成固定长队输出
(3)对于任意给定的x,计算H(x)相对容易,并且可以用软/硬件实现
(4)单向性(抗原向攻击):对任何给定的散列码h,找到满足H(x)= h的x在计算上是不可行的
(5)抗弱碰撞性(抗第二原向攻击):对任何给定的消息x,找到满足y≠x且H(x)= H(y)的y在计算上是不可行的
(6)抗强碰撞性:找到任何满足H(x)= H(y)的偶对(x,y)在计算上是不可行的
总的来说,MD5及相关散列算法的破解研究,在理论上是一种重大的进行,王小云教授及其后继者的研究,使得Hash算法在安全性上有了和大的进步,虽然随着计算机性能的几何性增长,Hash需要取得更长的长度才能防范生日攻击,但是随着改进,若Hash函数具备了足够的随机性,那么恶意碰撞的可能性就会急剧降低。就目前而言,虽然Hash算法具备本身的一些缺陷,但仍然是一种几号的安全性验证算法
安全散列函数SHA的发展:
近些年,应用最广泛的散列函数为安全Hash算法(SHA)。由于其他每一种被广泛应用的散列函数都已经被证实存在这密码分析学中的缺陷,从2005年以来,SHA或许仅存的安全散列算法。SHA由美国国家标准与技术研究院(NIST)开发。
·1995年,发布SHA-1(160bit)
·2002年,公布了SHA-2(SHA-256、SHA-384、SHA-512)
·2008年,增加了SHA-224
更详细如下图所示:
参考资料:
①散列函数攻击算法研究 浙江大学https://wenku.baidu.com/view/76db3b46e55c3b3567ec102de2bd960590c6d990.html
②-_-PX的CSDN博客:生日攻击
https://blog.csdn.net/px_farmer/article/details/52688806
③傲慢灬的CSDN博客:抗碰撞性、生日攻击及安全散列函数结构解析
https://blog.csdn.net/jerry81333/article/details/52763070
④Linuxest的CSDN博客:密码学:生日攻击
https://blog.csdn.net/ddk3001/article/details/52647990
⑤MD5百度百科
https://baike.baidu.com/item/MD5/212708?fr=aladdin
⑥SHA-1百度百科
https://baike.baidu.com/item/SHA1/8812671?fr=aladdin
(3)结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问题。
答:
MD5算法选择前缀碰撞:2007年,Stevents提出了MD5选择前缀碰撞算法,展示了如何在一对任意选取的MD5消息前缀后,通过构造一对后缀使得两部分级联后的消息对发生碰撞的过程,随后在2009年,Stevents等通过选取更加灵活的差分路径,进一步完善了MD5选择前缀碰撞算法,并给出了理论上最有攻击复杂度239;同时,利用X.509协议中标准的2048比特的RSA大数字段,运用选择前缀碰撞,成功通过3次近似碰撞伪造了CA证书,复杂度为249.9,两个复杂度的差异主要由实际应用时对近似碰撞块数的限制引起。2012年,Stevents等给出了最终完善后的MD5选择前缀碰撞流程及伪造证书等应用的细节。除Stevents等所做的相关工作外,周林对选择前缀碰撞的部分组件进行了多平台实现
软件完整性包含两部分:
(1)软件运行状态的完整性。软件在运行状态下,代码、金泰数据、动态数据和栈,必须保证不被未经授权的修改
(2)软件的控制流的完整性。软件运行时的执行路径要与软件静态代码所反映的流程图一致,及软件的行为不能被非授权用户通过任何方式修改和操控
为了使软件完整性校检和基于哈希值的数字签名具有任何价值,使用的加密哈希函数必须具有冲突性,也就是说,几乎不可能找到具有相同散列值的不同消息
MD5算法在验证软件完整性时可能出现的问题:
(1)MD5不防碰撞,可能被第三方非授权用户利用MD5的冲撞攻击缺陷,使用快速MD5碰撞生成器,获得相同MD5值数据,从而恶意篡改软件,软件的完整性受到威胁
(2)第二连接中helloworld.exe和goodbyworld.exe两个文件在执行时显示了不变得行为,一个是好的,一个是坏的,但是现在文件具有相同的MD5 哈希值,在无害的程序上获得的数字签名对恶意软件同样有效
(3)攻击者能够在文件被散列或签名之前对其进行操作,在软件完整性保护或代码签名方案中滥用chosen-prefix冲突
(4)用户不能确定已发布的散列值或数字签名只对他下载的可执行文件有效。特别是当软件完整性验证发生在后台时,用户不知道操作系统或某个隐藏的应用程序正在悄悄地验证安装阮加的数字签名,用户可能更容易被引诱安装恶意软件
(5)攻击者不需要从源代码构建两个可执行程序,他完全可以作为第一个文件从任何来源的任何可执行文件,并且作为第二个文件产生第二个可执行的恶意软件,然后在两个文件中添加一个字节块,这样产生的文件具有相同的MD5哈希值。如果攻击者得到第一个文件,这个签名也将对攻击者构建的恶意软件有效
故MD5不应再用作软件完整性或代码签名目的的散列函数
参考资料:
①MD5选择前缀碰撞算法的改进及复杂度分析 程宽、韩文报(1、信息工程大学; 2、数学工程与先进计算国家重点实验室)
http://www.cqvip.com/read/read.aspx?id=74837489504849524857485254