散列函数的应用及其安全性
学号:2016012048 姓名:王玉
1) 给出散列函数的具体应用。
HASH函数的特点:固定长度的输出,单向不可逆,碰撞约束。
正确的应用场景:
1,数据校验
HASH函数有类似数据冗余校验类似的功能,但是它比简单的冗余校验碰撞的概率要小得多,顾而在现在密码学中总是用HASH来做关键数据的验证。
2,单向性的运用
利用HASH函数的这个特点,我们能够实现口令,密码等安全数据的安全存储。密码等很多关键数据我们需要在数据库中存储,但是在实际运用的过程中,只是作比较操作,顾而我们可以比较HASH结果。这一点相信在银行等系统中有所运用,否则我们真的要睡不着觉了:)
3,碰撞约束以及有限固定摘要长度
数字签名正是运用了这些特点来提高效率的。我们知道非对称加密算法速度较低,通过HASH处理我们可以使其仅仅作用于HASH摘要上,从而提高效率。
4,可以运用HASH到随机数的生成和密码,salt值等的衍生中
因为HASH算法能够最大限度的保证其唯一性,故而可以运用到关键数据的衍生中(从一个随机的种子数产生,并且不暴露种子本身秘密)。
常见的误区:
1,误认为其是加密算法
有很多人把HASH算法当成是加密算法,这是不准确的,其实我们知道加密总是相对于解密而言的,没有解密何谈加密呢,HASH的设计以无法解为目的的。
2,不包含salt的口令HASH
注意如果我们不附加一个随机的salt值,HASH口令是很容易被字典攻击入侵的。
3,不注意中间人攻击
注意HASH并不能保证网络的安全,要防止攻击者同时替换数据和HASH。正确运用中要结合加密,签名。
2) 结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。问题2的回答可以参考下面给出的第一个链接。
生日攻击(原文链接:https://blog.csdn.net/ddk3001/article/details/52647990)
生日攻击是利用概率论中的生日问题,找到冲突的Hash值,伪造报文,使身份验证算法失效。
实例场景
1 场景说明
A要对一个合同文件进行签名,然后把合同文件和签名一起发送给接收者。
签名的方法:计算文件的Hash值(m位),然后使用A的私钥对这个Hash值进行加密。
接收者使用A的公钥进行解密,然后比较Hash值,这样他就能确认:
接收到的合同文件是A发送的,并且合同文件未被修改过。
攻击者B想要伪造一份假合同文件,然后发送给接收者,并使接收者仍然相信:
接收到的合同文件是A发送的,并且合同文件未被修改过。
2 攻击方法
B先准备 2^m/2 个有效合同文件(集合X),每个文件包含与原合同文件相同的意思。
B再准备 2^m/2 个伪造合同文件(集合Y),每个文件也都是希望的伪造合同的意思。
注1:2^m/2 表示 2 的 m/2 次方。
注2:要产生包含相同意思的许多文件,也不是很难。
例如要生成 2^32 个文件,方法是:在文件中找到32个地方,每个地方使用两种方式表达相同意思,这样组合起来,就有了 2^32 个文件,这些文件要表达的意思都相同。
然后比较集合X和集合Y,找到Hash值相同的两个文件,分别是有效合同和伪造合同。
B成功的概率会大于0.5,如果没有找到匹配的文件,就准备更多的有效文件和伪造文件,直到找到一对匹配的文件。
注3:如果使用64位Hash值,那么只需要2^32个不同文件,这无法防住现代计算机系统。
B把找到的有效合同文件提供A,A看了一下,没什么问题,就做了签名,然后发送给接收者。
在接收者收到消息之前,B截获了这个消息,然后使用伪造合同替换有效合同,再把伪造合同和原签名一起发送给接收者。
因为伪造合同与有效合同的Hash值相同,所以它们产生相同的签名。
这样,即使B不知道A的私钥,他也能成功!!!
3 遭遇失败
如果A是一个认真的人,他在对B提供的有效合同文件进行签名之前,又仔细阅读了合同,修改了其中的标点符号问题,然后才对文件进行签名。
这样,B的计划就失败了。
B面临的问题是:找到一个伪造合同,与新的合同文件具有相同的Hash值。
这几乎是不可能的!!!
防范方法
-
-
使用安全的Hash算法:安全的Hash算法生成的Hash值有足够多的位数。这样,攻击者在寻找两个具有相同Hash值的文件时就会非常困难。
-
加盐:在为文件签名之前,先向文件添加一个随机值,然后计算Hash值,再将文件、签名和随机值一起发送给接收者。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
-
改动文件:在为文件签名之前,对消息或文件做少许改动。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
-
散列函数的安全性
有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。Van Oorschot和Wiener曾经提出,花费1000万美元涉及一个被专门用来搜索MD5算法碰撞的机器,则平均24天内就可以找到一个碰撞。
2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经呗彻底攻破。
散列函数的安全要求
1.单向性:对任何给定的散列码h,找到满足H(x)=h的x在计算上是不可行的。
2.抗弱碰撞性:对任何给定的消息x,找到满足y≠x且H(x)=H(y)的y在计算上是不可行的。
3.抗强碰撞性:找到任何满足H(x)=H(y)的偶对(x,y)在计算上是不可行的。
3)结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问题。
md5算法
MD5是Message DigestAlgorithm MD5的缩写,中午名为消息摘要算法第5版。为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。算法的文件号为RFC1321。其实在生活中也广泛见识过MD5,下载一个文件时,当下载完成之后要进行MD5校验,校验的目的就是去检测下载的文件有没有被篡改,哪怕是动了一个bit位,下载文件的内容生成的MD5校验值跟原文生成的MD5校验值差距是天大的,这取决于MD5校验值的生成算法。
MD5之前还有MD2、MD4由于在安全性上的原因,最终还是被MD5替换。MD5的用处主要有一下几个场景:
1、数据完整性校验
检查数据有没有被篡改过,这里取个例子。当用Android手机进行OTA升级的时候,下载完升级包(不管是全升包还是增量包),紧接着就是用该升级包的标准MD5进行验证,如果校验的结果等于标准的MD5值,那么就证明这个升级包没有被篡改过。
2、不可逆的加密
像Unix系统中,用户用用户名和密码登陆系统,由于系统中存放的是用户名和密码组合MD5校验值,所以登陆框将会把用户名和密码进行MD5算法从而生成用户名和密码组合的MD5校验值,系统由此可以知道能不能登陆成功。
MD5算法解析
MD5是以512位做为一个单位来处理原文,每一个512位又被分成16*32位来进行处理,直到所有原文都被处理一遍。
1、首先要对原文进行填充,保证数据长度是512个位的整数倍,填充方式如下:
(原文+ n + 64) %512 = 0
n:表示需要在原文后面添加多少位,一般添加1个1,或n和0
64:表示原文的长度
2、MD5算法中,需要初始链接变量,作为算法第一轮运算的基础,它作为MD5算法的初始值,可以想象,就算是同一段原文在进行MD5生成时,只要链接变量不一样,生成的MD5校验值也是不一样的。
针对这512位为一个分组的数据,处理方式是将它分成16*32位。从程序上来看,主循环有4轮,每一轮对这个16个数字进行处理,这里需要提到4个函数,每一次的处理都是通过这4个函数来完成的。当经过这些循环之后,会生成一个32位的MD5目标校验值。如果采用相同的初始链接变量和4个函数,那么对于同一段原文生成的MD5目标校验值是一样的,所以,MD5就能去检测数据的完整性和一致性。
下面有两种方式实现MD5校验,一种是Java SDK提供的API去生成MD5校验值,另外一种是自己写的MD5校验。在使用时一定要注意链接变量和函数是否一致,避免不一致而导致的MD5失败。
问题
(1)md5算法不可逆
密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是***无法被解密***的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。