信息安全技术作业五
散列函数的具体应用:
1.消息认证:发送者根据待发送的消息使用该函数计算一组hash值,然后将hash值和消息一起发送过去。接收者收到后对于消息执行同样的hash计算,并将结果与收到的hash值进行对比。如果不匹配,则接收者推断出消息遭受了篡改。
(1)使用对称密码算法加密消息和hash码。因为只有A和B共享密钥,所以消息比如是发自A处,并且并未被更改过。这里附加的hash码提供了实现认证功能的结构。因为对于整个消息以及hash都使用了加密,保密性也被提供。
(2)使用对称密码算法只对hash码进行加密。对于无须保密性的应用,这种方案减少了加解密操作的负担。
(3)不使用加密算法,仅使用hash函数也能够实现消息认证。该方案假设通信双方共享相同的秘密值S。发送方A将消息M和秘密值S串联后计算其hash值,并将得到的hash值附在消息M后发送。因为接收方B同时掌握S,所以能够重新计算该hash值进行验证。由于秘密值S本身并没有在信道传送,攻击者不能够对在信道上拦截的信息进行修改,进而也不能制作假消息。
(4)通过将整个消息和hash值加密,能够在方案(3)的基础上提供保密性。
2.数字签名:数字签名的操作与MAC相似,在进行数字签名过程中使用用户的私钥加密消息的Hash值,其他人任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性。数字签名的应用比消息认证更为广泛。
(1)使用发送方的私钥,利用公钥密码算法仅对hash码进行加密。
(2)若既希望保证保密性又希望有数字签名,则先用发送方的私钥对hash码进行加密,再用对称密码中的密钥对消息和公钥算法加密结果进行加密。
3.其他应用:
(1)产生单向口令文件。当用户输入口令时,操作系统将比对输入口令的Hash值和存储在口令文件中的Hash值。
(2)入侵检测和病毒检测。将每个文件的Hash值H(F)存储在安全系统中,随后就能够通过重新计算H(F)来判断文件是否被修改过。
(3)密码学Hash函数能够用于构建随机函数PRF或用作伪随机数发生器。基于Hash函数的PRF可用于对称密码中的密钥产生。
散列函数的安全性以及目前安全散列函数的发展
1.生日攻击:
(1)生日攻击步骤:
a.随机在2^(n/2)信息空间中寻找一个M
b.求出相应的tag
c.寻找是否有碰撞,没有则返回步骤1
(2)破解时间
理论上而言,若抗碰撞性一直为2^n,而强抗碰撞性因为生日攻击的原因会降至2^(n/2)时间。由此可见,SHA-1已经越来越不安全了,数月或者数年后,2^80将不是一个无法逾越的计算时间。另外,因为计算机多为伪随机,因此现在SHA-1理论上所需的抗碰撞时间仅为2^55时间,但好像并没有人去证实过。
2.MD5安全性和SHA-1的安全性:
2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。在2017年,Google公司宣布实现了对SHA-1算法的攻击。SHA-1算法宣告攻破。不过需要注意的是,这次SHA-1算法破解的计算量相当于单个CPU计算6500年和单个GPU计算110年,因此就目前的PC硬件来看,依靠一台电脑完成破解是不现实的。然而密码学家认为,如果利用云计算技术来破解的话,这件事情将简单很多,可能只需要17万美元的预算即可完成,因此尽快改用安全性更高的SHA-2或SHA-3算法才是正确的做法。
3.散列函数的安全性:
(1)有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。
(2)安全散列函数结构:因为所需的安全散列长度越来越长,因此我们可以使用有限定义域上的散列函数(俗称压缩函数)通过迭代方式拓展为具有无限定义域的散列函数。而最为代表性的就Merkle-Damgard结构。这个结构的好处是,如果压缩函数是抗碰撞的,那经过此结构处理后的散列函数也是抗碰撞的。SM3,HMAC就是基于这种结构,因为Merkle-Damgard结构并不能抵抗扩展攻击,因此HMAC引入了Key。
4.目前散列函数的发展:
SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数,经历了SHA-0,SHA-1,SHA-2,SHA-3系列发展。2002年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称SHA-2。2008年又新增了SHA-224。NSA于2007年正式宣布在全球范围内征集新新一代(SHA-3)算法设计,2012年公布评选结果, Keccak算法最终获胜成为唯一官方标准SHA-3算法,但还有四种算法同时进入了第三轮评选,分别是:BLAKE, GrøSTL, JH和SKEIN,这些算法其实也非常安全,而且经受审查。
MD5算法验证软件完整性时可能出现的问题
Message Digest Algorithm MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
早期的碰撞样本,主要采用“前缀构造法”。前缀构造法碰撞后的两个样本只有尾部少量字节不同,而程序代码是相同的。通过判断尾部数据的差异,两个样本可以执行不同的程序流程。由于这种碰撞手法是通过同一前缀程序碰撞生成的两个样本,如果其中有恶意代码流程则两个样本均包含恶意代码,所以比较容易被安全软件识别,隐蔽性较差。
选择前缀碰撞法”实现原理:通过选择不同的前缀,计算生日数和碰撞块添加到文件尾部,即可得到两个具有相同的MD5的文件。不过,要计算出这些尾部数据并不容易,直接使用hashclash[[1]]的工具需要相当大的时间成本,但是碰撞作者对该工具进行改进后已经能够高效完成大量正常程序与恶意程序的碰撞了。
两个可执行文件的MD5消息摘要值和两个文件的执行结果:
HelloWorld.exe
GoodbyeWorld.exe
这两个程序会在屏幕上打印出不同的字符,但是它们的MD5都是一致的。这几位密码学家使用的是“构造前缀碰撞法”(chosen-prefix collisions)来进行此次攻击。
可能出现的问题:
1.两种不同格式的程序,其文件MD5是相同的;
2.如果安全软件在系统升级后没有考虑到双签名验证的情况,很有可能按照类似“正常”的逻辑判定这个恶意样本伪造的签名有效;