散列函数安全性扩展

一.散列函数的具体应用:

1,数据校验
    HASH函数有类似数据冗余校验类似的功能,但是它比简单的冗余校验碰撞的概率要小得多,顾而在现在密码学中总是用HASH来做关键数据的验证。

2,单向性的运用
    利用HASH函数的这个特点,我们能够实现口令,密码等安全数据的安全存储。密码等很多关键数据我们需要在数据库中存储,但是在实际运用的过程中,只是作比较操作,顾而我们可以比较HASH结果。这一点相信在银行等系统中有所运用。

3,碰撞约束以及有限固定摘要长度
    数字签名正是运用了这些特点来提高效率的。我们知道非对称加密算法速度较低,通过HASH处理我们可以使其仅仅作用于HASH摘要上,从而提高效率。

4,可以运用HASH到随机数的生成和密码,salt值等的衍生中
    因为HASH算法能够最大限度的保证其唯一性,故而可以运用到关键数据的衍生中(从一个随机的种子数产生,并且不暴露种子本身秘密)。

二.1散列函数的安全性:

生日攻击:是一个密码学的术语 ,广泛用于计算机领域 ,它来自于概率统计中的生日问题。生日问题:在n个人中随机选取k个人,当k为多大时能保证k个人中有两个人的生日是相同的?根据鸽笼原理(pigeon hole principle),如果有366个人,那么其中两个人必定会在同一天过生日。

但其实,用统计学的方法来考虑生日问题之后,假设至少有两个人同一天生日的概率为P,那么P的否定(我们写做1-P)就是没有任何两个人在同一天过生日的概率。假设我们有k个人,那么这k个人中没有任何两个人在同一天过生日的概率就是:最后解出来,当k=70的时候,P=99.9%这就是生日问题。
那么生日攻击,我们来看一个计算机领域中经常用到的东西:Hash functions简而言之就是用来把一样东西经过特定运算转换成另一样东西,输出的结果类型一定是相同的,更加严谨一点,长度也是相同的。这有点像密码,把你要传递的信息通过一些办法变成密码,无论信息是多是少,最后得到的密文一定是同一种类型的。比如fn x = x就是一个hash function,但是它没什么用,因为给它什么它还是照原样吐出来。

更高级的hash function有比如java中给字符串加密用的迭代方程一个hash function的好坏,就在于它是否能够使输出的值尽量分散,减少输出值的碰撞(collision),这样就能避免两样东西得到同样的输出,比如fn x=0就是一个非常不好的hash function,因为所有东西都被输出成了0。在安全性方面,hash function必须做到够复杂,让人不能够通过简单的几组输入输出结果猜出来这个hash function用的是什么样的算法,比如给你f(2)=4, f(3)=6, f(17361)=34722,很容易猜出这个f是什么。

有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。Van Oorschot和Wiener曾经提出,花费1000万美元涉及一个被专门用来搜索MD5算法碰撞的机器,则平均24天内就可以找到一个碰撞。

2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。

2017年2月23日,谷歌在blog上宣布实现了SHA-1的碰撞,将会在90天内公开算法。之前实现暴力破解需要12,000,000个gpu算一年,现在需要110个GPU算一年,破解效率大为提高。

SHA-1的安全性一直广受质疑,此次破解对于广泛使用SHA-1算法的协议如TTL,SSL,SSH都有影响。谷歌和微软已经在2016年停止了支持SHA-1的网站安全证书。那么此次破解都有些什么什么意义,对业界的影响有多大呢?

以SHA-1为例,其哈希结果长度为160bit。如果SHA-1本身没有漏洞,而攻击者想找到一组碰撞的话,最显然的方法是选取组不同的数据,依次计算它们的哈希结果。根据著名的抽屉原理,必然会出现一组数据,使得其哈希结果相同。此攻击方法需要调用次SHA-1,即计算量级大约为。

虽然这么寻找碰撞一定是可行的,但计算代价太大了。密码学上认为,如果能找到一种方法,能在计算时间小于的情况下,有超过生日攻击的概率下找到一组碰撞,则认为这个哈希函数就不安全了。

二.2安全散列函数的发展:

单向散列函数或者安全散列函数之所以重要,不仅在于消息认证(消息摘要,数据指纹),还有数字签名(加强版的消息认证)和验证数据的完整性。常见的单向散列函数有MD5和SHA

简单散列函数

    所有的散列函数都按照下面的基本操作。把输入(消息、文件等)看成n比特块的序列。对输入用迭代方法处理一块,生成n比特的散列函数。

        一种最简单散列函数的每一个数据块都按照比特异或。如下所示

                Ci = bi1⊕ bi2⊕ … ⊕ bim

        其中:

                Ci为散列码的第i比特,1<=  i <=n;

                m为输入中n比特数据块的数目;

                bij为第j块的第i比特;

                ⊕为异或操作

SHA安全散列函数

近些年,应用最广泛的散列函数是SHA。由于其他每一种被广泛应用的散列函数都已经被证实存在这密码分析学中的缺陷,接着到2005年,SHA或许仅存的安全散列算法。SHA由美国国家标准与技术研究院(NIST)开发。

● 1995年公布SHA-1
● 2002年,公布了SHA-2(SHA-256、SHA-384、SHA-512)
● 2008年,增加了SHA-224

三.早期的“前缀构造法”:以同一个给定的前缀程序A为基础,在尾部添加不同的附加数据,得到两个具有相同MD5的样本B和C。前缀构造法碰撞后的两个样本只有尾部少量字节不同,而程序代码是相同的。通过判断尾部数据的差异,两个样本可以执行不同的程序流程。由于这种碰撞手法是通过同一前缀程序碰撞生成的两个样本,如果其中有恶意代码流程则两个样本均包含恶意代码,所以比较容易被安全软件识别,隐蔽性较差。

而采用新型的MD5碰撞手法,得到两个MD5校验值相同的样本,一个是恶意程序,另一个则是正常程序,它们在功能和代码上完全不同。由两个不同的前缀程序A和B分别在尾部添加附加数据,构造出具有相同MD5的程序C和D,这一阶段,碰撞作者主要是通过正常程序与恶意程序两种不同程序碰撞相同的MD5来对抗安全软件。两款毫不相关的程序MD5值校验却可以神奇的一致

MD5算法验证软件完整性可能出现的问题:

1)无法保证正确性和完整性,黑客可能更改信息

2)黑客可能通过MD5快速碰撞生成器,伪造相同的MD5(但很大可能内容不同),对文件进行篡改。

goodbyworld.exe程序运行截图:

相关链接:

如何评价 2 月 23 日谷歌宣布实现了 SHA-1 碰撞?

https://www.zhihu.com/question/56234281/answer/148349930

网络安全-安全散列函数,信息摘要SHA-1,MD5原理

https://blog.csdn.net/hherima/article/details/36879321

抗碰撞性、生日攻击及安全散列函数结构解析

https://blog.csdn.net/jerry81333/article/details/52763070

MD5碰撞的演化之路

http://www.freebuf.com/articles/93780.html

MD5碰撞

http://www.cnblogs.com/A2008A/archive/2012/08/10/2631840.html

猜你喜欢

转载自www.cnblogs.com/2016SE_NENU/p/9029196.html
今日推荐