一、散列函数在信息安全方面的应用主要体现
- 消息认证
在一个开放通信网络的环境中,信息面临的攻击包括窃听、伪造、修改、插入、删除、否认等。因此,需要提供用来验证消息完整性的机制或服务,即消息认证。这种服务的主要功能是确保收到的消息确实与发送的一样和确保消息的来源真实有效。用于消息认证的最常见的密码技术是基于哈希函数的消息认证码。
- 文件校验(数据完整性校验)
比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算MD5 checksum的命令。
- 数字签名
Hash算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。数字签名运用了碰撞约束以及有限固定摘要长度等这些特点,其仅仅作用于Hash摘要上,从而提高效率。对Hash值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。
- 鉴权协议
需要鉴权的一方,向被鉴权的一方发送随机串(“挑战”),被鉴权方将该随机串和自己的鉴权口令字一起进行Hash运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行Hash运算的结果相比较(“认证”),如相同,则可在统计上认为对方拥有该口令字,即通过鉴权。在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法,该鉴权协议又被称作"挑战--认证模式。
- 单向性的运用
利用Hash函数的这个特点,我们能够实现口令,密码等安全数据的安全存储。当用户输入口令时,操作系统将比对输入口令的Hash值和存储在口令文件中的Hash值。密码等很多关键数据我们需要在数据库中存储,但是在实际运用的过程中,只是作比较操作,顾而我们可以比较Hash结果。
- 入侵检测和病毒检测
将每个文件的Hash值H(F)存储在安全系统中,随后就能够通过重新计算H(F)来判断文件是否被修改过。
- 随机数的生成和密码、salt值等的衍生
因为Hash算法能够最大限度的保证其唯一性,故而可以运用到关键数据的衍生中(从一个随机的种子数产生,并且不暴露种子本身秘密)。
二、列函数的安全性以及目前安全散列函数的发展
1、生日攻击
生日攻击是利用概率论中的生日问题,找到冲突的Hash值,伪造报文,使身份验证算法失效。生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度。这种攻击对Hash函数提出了一个必要的安全条件,即消息摘要必须足够长。
2、MD5安全性和SHA-1的安全性
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串) ,用以提供消息的完整性保护。
2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞,MD5已经被彻底攻破。
SHA1对于长度小于2^64位的消息会产生一个160位的消息摘要,当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
在2017年,Google公司宣布实现了对SHA-1算法的攻击,SHA-1算法宣告攻破。
3、散列函数安全性
有以上得出有两种方法可以攻击安全散列函数:暴力攻击法(穷举攻击)和密码分析法。
- 暴力攻击:不依赖于任何算法的细节,仅与相应的长度有关。
由于完全依赖于算法生成的散列码长度,所需的安全散列长度越来越长,因此我们可以使用有限定义域上的散列函数(俗称压缩函数)通过迭代方式拓展为具有无限定义域的散列函数。而最为代表性的就Merkle-Damgard结构,其好处是,如果压缩函数是抗碰撞的,那经过此结构处理后的散列函数也是抗碰撞的。
- 密码分析:依赖于具体算法的设计缺陷,利用算法的某种性质。
理想的Hash函数要求密码分析攻击所需的代价大于或等于穷举攻击所需的代价。
4、目前散列函数的发展
由于其他每一种被广泛应用的散列函数都已经被证实存在这密码分析学中的缺陷,接着到2005年,SHA或许为仅存的安全散列算法,应用最广泛的散列函数。
SHA系列是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数,经历了SHA-0(1993),SHA-1(1995),SHA-2(2002)系列发展。2007年,NSA正式宣布在全球范围内征集新新一代(SHA-3)算法设计,2012年公布评选结果, Keccak算法最终获胜成为唯一官方标准SHA-3算法,但还有四种算法同时进入了第三轮评选,分别是:BLAKE, GrøSTL, JH和SKEIN,这些算法其实也非常安全,而且经受审查,被各种竞争币频繁使用。
直到2017年2月23日,Google经过两年的研究,表示其已经成功破解了SHA-1加密。目前SHA-2各版本已成为主流,而世界上目前几乎没有任何软件或硬件支持SHA-3算法。
前量子计算算法的Grover算法和Shor算法已经可以破译当今广泛使用的密码。Shor算法是一种量子计算机求解离散对数问题的算法,它能够攻破RSA、DSA和ECDSA密码,Grover算法没有Shor算法有效,它的作用相当于把密码的秘钥长度减少一半,密码技术人员可以通过加长秘钥长度来抵抗Grpver算法攻击。
值得注意的是,国外的量子计算机发展迅速,已有像谷歌这样的著名公司将量子计算机投入使用,用于提高信息搜索效率和研究量子人工智能。如今的量子计算机还不足以通过执行Shor算法或Grover算法来大肆攻击现有密码。
对于Hash函数未来的研究方向,主要集中在两个方向。一是对Hash函数本身性质的研究,Hash函数作为密码学的基础模块,一直没有完全成熟的理论,这有待于继续完善。二是新Hash函数的设计。新Hash函数的设计可以从两种途径考虑。一是基于分组密码构造Hash。AES等更新更安全的分组密码的出现为这一方向奠定了基础,这个方向的重点应该是双倍长度并且高效的构造方式; 二是采用新的方式直接设计新算法。在新算法的设计中应该尽量引入分组密码的设计理念和准则。比如S盒,线性变换,变化的循环移位,快速有效的混和等等。另外,对于分组密码的安全分析也应该用于Hash函数的分析,比如对线性攻击,代数攻击的抵抗能力等。又因为Hash函数有其自身的特点,还要注意某些对于分组密码并不构成足够威胁的攻击方法,比如相关密钥攻击等等。
三、md5算法在验证软件完整性时可能出现的问题
1、选择前缀碰撞
将碰撞合并到一对文件中时,除了构成碰撞的相对较小的随机查找字节块之外,构造碰撞的原始方法要求文件完全相等。如果两个文件存在任何碰撞(冲突)的地方,发生前缀碰撞后,这两个文件完全相同,即得到相同的MD5。
2、两个可执行文件的MD5消息摘要值和两个文件的执行结果
HelloWorld.exe的执行结果是窗口一闪而过。GoodbyeWorld.exe的执行结果如下图:
这两个程序会执行结果不同,但是它们的MD5都是一致的:18FCC4334F44FED60718E7DACD82DDDF
。这几位密码学家使用的是“构造前缀碰撞法”来进行此次攻击,得出结论:MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。
3、MD5验证软件完整性时可能出现的问题
- 不同的文件可以产生相同的检验值,无法保证文件的来源可靠性,即不能确认接收方接收到的文件与发送方的发出文件一致,由此验证文件未被篡改已不可靠。
- 黑客可以通过软件伪造MD5值,病毒木马就能很轻松的躲过MD5校检,所以无法通过校验MD5知道网站是否被黑客入侵篡改,是否曾被恶意植入病毒或木马。
- 当软件过大时,在验证过程中所需的时间也会大大增加,验证效率较低,给中间攻击者的攻击行为提供足够的攻击时间而增加安全风险。
- 不能确保文件的完整性。如果有第三方在验证软件完整性时截取软件代码,使用快速MD5碰撞生成器,在短时间内伪造一份相同的MD5,并恶意篡改软件,那么安全性将会大大下降。