目录:
一,给出散列函数的具体应用。
二,结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。问题2的回答可以结合下面给出的第一个链接。
三,结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法来验证软件完整性时可能出现的问题。
一,给出散列函数的具体应用。
哈希函数(英语:Hash Function)是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
由于散列函数的应用的多样性,它们经常是专为某一应用而设计的。例如,加密散列函数假设存在一个要找到具有相同散列值的原始输入的敌人。一个设计优秀的加密散列函数是一个“单向”操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。为加密散列为目的设计的函数,如MD5,被广泛的用作检验散列函数。这样软件下载的时候,就会对照验证代码之后才下载正确的文件部分。此代码有可能因为环境因素的变化,如机器配置或者IP地址的改变而有变动。以保证源文件的安全性。 总体来说,散列函数的具体应用主要有以下方面:
1.错误校正
使用一个散列函数可以很直观的检测出数据在传输时发生的错误。在数据的发送方,对将要发送的数据应用散列函数,并将计算的结果同原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,如果两次散列函数计算出来的结果不一致,那么就说明数据在传输的过程中某些地方有错误了。这就叫做冗余校验。
对于错误校正,假设相似扰动的分布接近最小(a distribution of likely perturbations is assumed at least approximately)。对于一个信息串的微扰可以被分为两类,大的(不可能的)错误和小的(可能的)错误。我们对于第二类错误重新定义如下,假如给定 H(x) 和 x+s,那么只要s足够小,我们就能有效的计算出x。那样的散列函数被称作错误校正编码。这些错误校正编码有两个重要的分类:循环冗余校验和里德所罗门码。
2.语音识别
对于像从一个已知列表中匹配一个MP3文件这样的应用,一种可能的方案是使用传统的散列函数——例如MD5,但是这种方案会对时间平移、CD读取错误、不同的音频压缩算法或者音量调整的实现机制等情况非常敏感。使用一些类似于MD5的方法有利于迅速找到那些严格相同(从音频文件的二进制数据来看)的音频文件,但是要找到全部相同(从音频文件的内容来看)的音频文件就需要使用其他更高级的算法了。
那些并不紧随IT工业潮流的人往往能反其道而行之,对于那些微小差异足够鲁棒的散列函数确实存在。现存的绝大多数散列算法都是不够鲁棒的,但是有少数散列算法能够达到辨别从嘈杂房间里的扬声器里播放出来的音乐的鲁棒性。有一个实际的例子是Shazam服务,用户可以用电话机拨打一个特定的号码,并将电话机的话筒靠近用于播放音乐的扬声器,该项服务会分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较,用户就能够收到被识别的音乐的曲名。
3,散列表
散列表是散列函数的一个主要应用,使用散列表能够快速的按照关键字查找数据记录。(注意:关键字不是像在加密中所使用的那样是秘密的,但它们都 是用来“解锁”或者访问数据的。)例如,在英语字典中的关键字是英文单词,和它们相关的记录包含这些单词的定义。在这种情况下,散列函数必须把按照字母顺 序排列的字符串映射到为散列表的内部数组所创建的索引上。
散列表散列函数的几乎不可能/不切实际的理想是把每个关键字映射到唯一的索引上(参考完美散列),因为这样能够保证直接访问表中的每一个数据。
一个好的散列函数(包括大多数加密散列函数)具有均匀的真正随机输出,因而平均只需要一两次探测(依赖于装填因子)就能找到目标。同样重要的是,随机散列函数几乎不可能出现非常高的冲突率。但是,少量的可以估计的冲突在实际状况下是不可避免的(参考生日悖论)。
在很多情况下,heuristic散列函数所产生的冲突比随机散列函数少的多。Heuristic函数利用了相似关键字的相似性。例如,可以设 计一个heuristic函数使得像FILE0000.CHK, FILE0001.CHK, FILE0002.CHK, 等等这样的文件名映射到表的连续指针上,也就是说这样的序列不会发生冲突。相比之下,对于一组好的关键字性能出色的随机散列函数,对于一组坏的关键字经常 性能很差,这种坏的关键字会自然产生而不仅仅在攻击中才出现。性能不佳的散列函数表意味着查找操作会退化为费时的线性搜索。
4.信息安全
Hash算法在信息安全方面的应用主要体现在以下方面:
(1)消息认证
消息认证是用来验证消息完整性的一种机制和服务。消息认证确保收到的数据确实和发送时的一样(即没有修改,插入,删除或重放)。此外,通常还要求消息认证机制确保发送方声称的身份是真实有效的。
目的:保证信息的完整性——验证信息的发送者是不是伪冒的(信源识别);验证信息在传送或存储过程中未被篡改,重放或延迟等。
方法:使用鉴别函数——证实收到的消息来自可信的源点且未被篡改。
鉴别函数分类:(1)信息加密;(2)散列函数;(3)消息认证码;
Hash码能够通过如下不同方法用于提供消息认证
a) 使用对称密码E加密消息和Hash码,由于只有A和B共享密钥K,所以消息必然发自A处,且可通过验证Hash码证明数据在传输过程中未被更改。
b) 使用对称密码只对Hash码加密。由于明文无需加密性的应用,这种方案大大减少了加密操作的负担。
c) 不使用加密算法,仅使用Hash函数实现消息验证。该方案中,通信双方共享相同的秘密值S,发送方A将消息M和秘密值S串联后计算其Hash值,并将得到的Hash值附在消息M后发送。因为接收方B同时掌握S值,所以能够重新计算该Hash值进行验证。
d) 在方案c的基础上将整个消息和Hash值加密,以提供保密性。
(2)数字签名
目的:防止通信双方的抵赖行为。
原理:利用已公开的验证算法生成数字签名,并将签名连接到被签消息上,数字签名可复制。
Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
数字签名的应用比消息认证更加广泛。主要有如下两种方案:
a) 使用发送方的私钥利用公钥密码算法对Hash码进行加密。这种方法也可提供认证;由于只有发送方可以产生加密后的Hash码,所以这种方法也提供了数字签名。
b) 若既希望保证保密性又希望有数字签名,则先用发送方的私钥对Hash码加密,再用对称密码中的密钥对象消息和公钥算法加密结果进行加密,这种技术比较常用。
(3)文件校验
我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
(4)鉴权协议
如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。
(5)其他应用:
(1)产生单向口令文件
当用户输入口令时,操作系统将比对输入口令的Hash值和存储在口令文件中的Hash值,这样一来,黑客即使能够访问口令文件,也不能够获取真正的口令。
(2)入侵检测和病毒检测
将每个文件的Hash值H(F)存储在安全系统中,随后就能够通过重新计算H(F)来判断文件是否被修改过。入侵者只能够改变F,而不能够改变H(F)。
(3)构建随机函数(PRF)或用做伪随机数发生器(PRNG)
基于Hash函数的PRF可用于对称密码中密钥产生。
参考文件:
散列函数的应用及其安全性。http://www.mamicode.com/info-detail-2289460.html
Hash算法_概念https://blog.csdn.net/xinyuan510214/article/details/50606170
二.结合生日攻击以及2004、2005年王晓云教授有关MD5安全性和2017年Google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。(参考文献:https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html)
1, 生日攻击
生日攻击是利用概率论中的生日问题,找到冲突的Hash值,伪造报文,使身份验证算法失效。
防范方法··················
• 使用安全的Hash算法:安全的Hash算法生成的Hash值有足够多的位数。这样,攻击者在寻找两个具有相同Hash值的文件时就会非常困难。
• 加盐:在为文件签名之前,先向文件添加一个随机值,然后计算Hash值,再将文件、签名和随机值一起发送给接收者。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
• 改动文件:在为文件签名之前,对消息或文件做少许改动。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
2,MD5 和 SHA1
MD5 和 SHA1 是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。MD4(RFC 1320)是 MIT 的Ronald L. Rivest在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32位操作数的位操作来实现的。
MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。
SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于2^64位的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。
2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。在2017年,Google公司宣布实现了对SHA-1算法的攻击。SHA-1算法宣告攻破。实际上对于MD5来说,由于它的摘要信息位数比较短(128 bit),现在用普通的计算机可以在几小时甚至几分钟之内找到冲撞对,这就是相当“廉价”了。而对于SHA-1(160 bit)来说,王小云教授的成果证明可以在2的69次方次尝试后找到冲撞对(这个结果之后在被不断地被改进),但这个计算量仍然过大,以当代的计算机运算能力来说,现实上仍然很难实现(需要的运算量大意味着需要的资金大)。对MD5的冲撞攻击是比较容易的,对SHA-1的冲撞攻击相对代价较大,但是随着机算机能力年年的发展正变得越来越容易实现
MD5和SHA-1共性:
1.都是“不可逆”的函数。不存在一个算法能够由哈希值倒算出原始信息。
2.对原始信息的任何一点改变都会导致结果的哈希值巨大的不同。举个例子,假如原始数据是几百万字的文章,你在其中哪怕改动一个标点,计算出的哈希值都会有很大的变化。
3.运算代价是相对较低的。普通的AMDOpteron 2.2GHz的芯片,每秒可以计算出335MB数据的MD5值,可以计算192MB数据的SHA-1值。
MD5 与SHA-1 的比较
由于MD5 与SHA-1均是从MD4 发展而来,它们的结构和强度等特性有很多相似之处,表(1)是对MD5 与SHA-1 的结构比较。SHA-1与MD5 的最大区别在于其摘要比MD5 摘要长 32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5 是2128 数量级的操作,SHA-1 是2160 数量级的操作。产生具有相同摘要的两个报文的难度:MD5是 264 是数量级的操作,SHA-1 是280 数量级的操作。因而,SHA-1对强行攻击的强度更大。但由于SHA-1 的循环步骤比MD5 多(80:64)且要处理的缓存大(160 比特:128 比特),SHA-1 的运行速度比MD5 慢。
散列函数的目的是文件、消息或者其他数据块产生“指纹”。为满足在消息认证中的应用,散列函数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函数的安全性很大程度上取决于抗强碰撞的能力。目前已有的对Hash函数攻击的方法包括生日攻击、彩虹表攻击、差分攻击等。Hash函数的算法结构特点和Hash值的长度是决定函数碰撞性的而主要因素,Hash值越长,抵御越强。SHA-256有256比特Hash值,MD5和SHA-1分别有128和160比特的Hash值。
到目前为止,有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。
穷举攻击:
• 不依赖于任何算法的细节,仅与相应的长度有关。2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。
• 对于长度为m的Hash码,对于穷举攻击所需付出的代价分别于下表中相应量成正比.(通过生日悖论进行穷举攻击)
抗原像攻击 | 2m |
抗弱碰撞攻击 | 2m |
抗强碰撞攻击 | 2m/2 |
密码分析:
依赖于具体算法的设计缺陷,利用算法的某种性质。理想的Hash函数要求密码分析攻击所需的代价大于或等于穷举攻击所需的代价。
目前安全散列函数的发展
• 近些年,应用最广泛的散列函数是SHA。由于其他每一种被广泛应用的散列函数都已经被证实存在这密码分析学中的缺陷,接着到2005年,SHA或许仅存的安全散列算法。SHA由美国国家标准与技术研究院(NIST)开发。
• 直到2017年2月23日,Google经过两年的研究,表示其已经成功破解了SHA-1加密。谷歌公司多年来一直主张弃用SHA-1方案,特别是在TLS证书签署等场景之下。早在2014年,Chrome小组就宣布将逐渐淘汰对SHA-1的使用。Google希望自己针对SHA-1完成的实际攻击能够进一步巩固这一结论,让更多人意识到其已经不再安全可靠。
• 谷歌亦希望这一针对SHA-1的实际攻击案例能够最终说服整个技术业界尽快转向更为安全的替代性方案,例如SHA-256和SHA-3。
● 1995年公布SHA-1
● 2002年,公布了SHA-2(SHA-256、SHA-384、SHA-512)
● 2008年,增加了SHA-224
SHA算法各个版本参数比较:
三.结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法来验证软件完整性时可能出现的问题。
(1)MD5算法的特点:
压缩性:任意长度的数据,算出的MD5值长度都是固定的。
容易计算:从原数据计算出MD5值很容易。
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
MD5:Message Digest Algorithm MD5 为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
(2)MD5选择前缀碰撞:
选择前缀冲突——前缀冲突只要求在碰撞后文件应该完全相等。在碰撞之前,要找到碰撞的两个文件可以是任何东西:我们所选择的前缀碰撞查找方法总是会产生一个冲突,该冲突可以被合并到两个文件中,而不管碰撞之前存在什么数据。
helloworld.exe和goodbyworld.exe两个可执行文件不同,但md5相同。
(3)md5算法来验证软件完整性时可能出现的问题:
1,不能确保文件的完整性。尤其是不能确保在文件传输、磁盘错误或其他无恶意涉入的情况下文件的正确性。
2,不能确保自己从网络下载的文件,是否就是原发布者所提供的文件。
3,不能通过校验MD5知道网站是否被黑客入侵篡改,是否曾被恶意植入病毒或木马。