2016012023李伟 散列函数的应用及其安全性

一、散列函数的具体应用

加密
  一个典型的加密单向函数是“非对称”的,并且由一个高效的散列函数构成;一个典型的加密暗门函数是“对称”的,并且由一个高效的随机函数构成。
确保传递真实的信息
  消息或数据的接受者确认消息是否被篡改的性质叫数据的真实性,也称为完整性。发信人通过将原消息和散列值一起发送,可以保证真实性。
散列表
  散列表是散列函数的一个主要应用,使用散列表能够快速的按照关键字查找数据记录。例如,在英语字典中的关键字是英文单词,和它们相关的记录包含这些单词的定义。在这种情况下,散列函数必须把按照字母顺序排列的字符串映射到为散列表的内部数组所创建的索引上。
散列表散列函数的几乎不可能/不切实际的理想是把每个关键字映射到唯一的索引上,因为这样能够保证直接访问表中的每一个数据。
一个好的散列函数(包括大多数加密散列函数)具有均匀的真正随机输出,因而平均只需要一两次探测(依赖于装填因子)就能找到目标。同样重要的是,随机散列函数不太会出现非常高的冲突率。但是,少量的可以估计的冲突在实际状况下是不可避免的(参考生日悖论或鸽洞原理)。
错误校正与检测
  使用一个散列函数可以很直观的检测出数据在传输时发生的错误。在数据的发送方,对将要发送的数据应用散列函数,并将计算的结果同原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,如果两次散列函数计算出来的结果不一致,那么就说明数据在传输的过程中某些地方有错误了。这就叫做冗余校验。
Rabin-Karp字符串搜索算法
  Rabin-Karp字符串搜索算法是一个相对快速的字符串搜索算法,它所需要的平均搜索时间是O(n).这个算法是创建在使用散列来比较字符串的基础上的。

二、散列函数的安全性以及目前安全散列函数的发展

安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

散列函数的安全性

 2004年8月17日,在 CRYPTO 2004的Rump会议上,王小云,冯登国(Feng)、来学嘉(Lai),和于红波(Yu)宣布了攻击MD5、SHA-0和其他散列函数的初步结果。他 们攻击SHA-0的计算复杂度是240,这意谓的他们的攻击成果比Joux还有其他人所做的更好。请参见MD5安全性。2005年二月,王小云和殷益群、 于红波再度发表了对SHA-0破密的算法,可在239的计算复杂度内就找到碰撞。

2005年二月,王小云、殷益群及于红波发表了对完整版SHA-1的攻击,只需少于269的计算复杂度,就能找到一组碰撞。(利用生日攻击法找到碰撞需要280的计算复杂度。)

(生日攻击(Birthday Attack):根据抽屉原理,一个屋子里必须有366个人(一年有365天,不考虑闰年)才能保证一定有2个人生日相同。然而,如果一个屋子里有23个人,则有50%的概率2个人生日相同。密码学上认为,如果能找到一种方法,能在计算时间小于2^{80}的情况下,有超过生日攻击的概率下找到一组碰撞,则认为这个哈希函数就不安全了。
这 篇论文的作者们写道;“我们的破密分析是以对付SHA-0的差分攻击、近似碰撞、多区块碰撞技术、以及从MD5算法中查找碰撞的消息更改技术为基础。没有 这些强力的分析工具,SHA-1就无法破解。”此外,作者还展示了一次对58次加密循环SHA-1的破密,在233个单位操作内就找到一组碰撞。完整攻击 方法的论文发表在2005年八月的CRYPTO会议中。
殷益群在一次面谈中如此陈述:“大致上来说,我们找到了两个弱点:其一是前置处理不够复杂;其二是前20个循环中的某些数学运算会造成不可预期的安全性问题。”
2005年8月17日的CRYPTO会议尾声中王小云、姚期智、姚储枫再度发表更有效率的SHA-1攻击法,能在263个计算复杂度内找到碰撞。

碰撞攻击、原象攻击、生日攻击、暴力破解、彩虹表、旁路攻击、长度扩展攻击

MD5,SHA1,SHA256不是用来保存密码用的, 是用来校验数据完整性用的

散列函数的发展
SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。
SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。但SHA-1的安全性在2000年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1[1]。
SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的散列算法。
SHA-3:2015年正式发布,SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。

SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的散列算法。

三、md5算法在验证软件完整性时可能出现的问题

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

选择前缀攻击则是构造两个不同的消息s1和s2,他们不必有共同的前缀,但是经过在尾部附加不同的“碰撞块”后,两个消息的散列值相同。选择前缀攻击是包括共同前缀攻击的,因此共同前缀的攻击代价小于选择前缀攻击。对于两个给定的不同前缀p1和p2,CPC攻击可以构造出两个后缀m1和m2,使得
hash(p1+m1) = hash(p2+m2)
而且p1+m1的长度和p2+m2的长度相等。
举个例子,令p1=“希拉里会当选”,p2=“川普会当选”。在大选之前先利用CPC攻击,构造出两个后缀m1和m2,然后计算他们的MD5值v=MD5(p1+m1)=MD5(p2+m2)。然后告诉世人本次大选结果的md5值是v。在真正结果揭晓后,若希拉里当选,则展示p1+m1,否则展示p2+m2,即可完成预测。当然实际场景下没有那么简单,任何人看到“XXX当选”后面那串毫无意义的后缀字串都会产生质疑。在实际攻击场景中往往需要一个可以在末尾附加额外数据的数据结构上进行CPC攻击,例如PE可执行文件、ZIP压缩文件、JPG图像文件等末尾都可以加入后缀且不影响正常使用。利用CPC攻击,还可以构造多个消息的碰撞。

 

helloworld.exe和goodbyworld.exe这两个程序会在屏幕上打印出不同的字符,但是它们的 MD5 都是一样的,却又都能正常运行,并且可以做完全不同的事情。

 

MD5 算法不应再被用于任何软件完整性检查或代码签名的用途。

猜你喜欢

转载自www.cnblogs.com/hiawei/p/9029059.html