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

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

一、 散列函数

散列函数、即曾在数据结构中接触到的哈希函数,这里引用wiki对其的介绍:“散列函数是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。”

二、散列函数的应用

       第一个要提到的是散列函数在数据结构课程中介绍的有关数据查找的应用。其基本思想便是用散列函数建立存储位置与查找关键字之间的对应关系,从而更加快捷的进行查找操作。

       第二个提到的哈希函数的课程是计算机组成原理。在计算机组成原理中介绍了哈希函数错误校正的功能,但并没有过多赘述。应用的是类似的思想,但在计算机组成原理这门课程中并没有详细的提到哈希函数。

       第三个应用便是本节课课程中哈希函数在加密方面的应用。在密码学中哈希函数主要应用与加密,身份验证与确保信息的完整性。利用“散列函数是一种从任何一种数据中创建小的数字“指纹”的方法“这种特性来对信息进行加密,也可利用生成的”指纹“来对原数据进行校验。

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

       无论是生日攻击,还是MD5安全性问题的讨论,都无不指出了哈希函数的一个问题:它的定义域远大于它的值域。纵使人们将哈希函数设计的尽可能的复杂(类似于MD5加密),哈希函数依旧无法避免出现偶尔的碰撞现象(在数据结构中成为冲突)。

  

 

上图中的作者就给出了拥有两个相同MD5的字符串。如果有人恶意利用这样的碰撞,利用拥有相同HASH值的恶意文件去代替原来的正确文件攻击他人,无疑会造成重大损失(如果太过相信哈希函数的加密能力的话)。

       而目前SHA的做法,我个人的看法就是还是去增大哈希函数的值域,或者减小碰撞发生的几率。第一代SHA-0的破解历经6年,人们才将碰撞所需的计算复杂度从2^80降至2^39。在SHA-1的破解中,研究人员依旧是去攻击哈希函数的根本性问题——碰撞。SHA-2的资料不多,在wiki百科中显示的是,加密算法的开发人员依旧在继续让用于加密的哈希函数越来越复杂(当然,SHA本身也就是安全散列函数的缩写),看来在未来的一段时间安全散列函数的发展还会继续朝着越来越复杂的散列函数走去。

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

       正如我在上文阐述散列函数的安全性时提到的那样,由于碰撞(亦或者冲突吧…)的存在,攻击者可以利用选择前缀碰撞去构建一个拥有与你源文件相同的恶意软件。而在验证该软件的完整性时MD5算法并不能去发现这个恶意软件,即它并不能做到验证该软件的完整性。

最后附上http://www.win.tue.nl/hashclash/SoftIntCodeSign/网站中对该问题阐述的机翻版本。

注意:以下文本来自http://www.win.tue.nl/hashclash/SoftIntCodeSign/网站,非作者原创

由两个不同文件共享的散列值是碰撞构建过程的结果。我们无法定位给定的散列值,并生成一个(有意义的)输入位串哈希到给定的值。在加密术语中:我们的攻击是对抗碰撞的攻击,而不是对原像或第二原像的抵抗。这意味着,攻击者必须专门准备两个相互冲突的文件,然后才能在下载网站上发布或通过代码签名方案进行签名。已知散列的现有文件尚未用这种方法准备好,这些文件不容易受到攻击。 然而,我们可以很容易地做的是在几个额外的字节上进行蛮力搜索,例如,让散列值的前三个和最后三个字节与给定目标匹配。这已经可能引入额外的漏洞,因为很多人(包括我们中的至少两个人)通常在检查散列值时仅查看第一个和最后三个字节。 为了滥用软件完整性保护或代码签名方案中的选择前缀冲突,攻击者应能够在文件被散列和/或签名之前对其进行操作。这可能意味着攻击者需要内部人员访问运行可信软件完整性保护或代码签名过程的一方。具有此类访问权限的攻击者无论如何都可能会造成更多伤害,而无需选择前缀冲突,从而获得恶意软件上的“官方”数字签名。 另一方面,存在依赖方的观点,即用户下载哈希或签名代码需要一定的保证,该软件是可信的。该依赖方无法确定发布的散列值或数字签名是否仅对他下载的可执行文件有效。很可能有一个具有相同散列值或数字签名的兄弟文件,而这些兄弟姐妹中只有一个经历了适当的散列或签名过程。特别是当软件完整性验证发生在引擎盖下时,由于用户不知道操作系统或某个隐藏的应用程序正在安静地验证要安装的软件上的数字签名,因此用户可能更容易被引诱到安装恶意软件。 请注意,攻击者无需从源代码构建两个可执行文件。从任何来源获取可执行文件的第一个文件并将其作为第二个可执行文件生成恶意软件是完全可能的。然后可以找到要附加到两个文件的字节块,以便生成的文件具有相同的MD5散列值。如果攻击者然后可以获得第一个要签名的文件,例如由原始软件供应商提供的此签名也适用于攻击者构建的恶意软件。 可以反对的是,在对可执行文件进行比特级检查时,很明显在可执行文件的末尾会出现一个奇怪的非功能随机查找字节块。这对专家们来说可能是事实,因为他们知道在可执行文件中会发生什么,至少对我们来说,在可执行文件中应该和不应该预期什么是完全神秘的。此外,可能很有可能隐藏碰撞块不在最后,而是隐藏在二进制可执行文件的不太显眼的地方的其他位置。

posted @ 2018-05-13 22:54  zhanghang_blogs  阅读(277)  评论(0编辑  收藏  举报