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

题目内容要求:(1) 给出散列函数的具体应用。(2) 结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。问题2的回答可以参考下面给出的第一个链接。(3)结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问题。

链接1:https://www.win.tue.nl/hashclash/

链接2:http://www.win.tue.nl/hashclash/SoftIntCodeSign/

 

1.散列函数的具体应用

  在说具体应用之前,先介绍什么是散列函数:散列函数就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

  具体应用:

  (1)文件校验

    我们比较熟悉的校验算法有奇偶校验和CRC校验,这两种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。

    MD5 Hash算法的“数字指纹”特性,使它成为目前应用最广泛的一种文件完整性校验和算法,不少Unix系统有提供md5 checksum的命令。

  (2)数字签名

    哈希算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单项散列函数扮演了一个重要的角色。对hash值,又称“数字摘要”进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。

  (3)鉴权协议

    如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。以上就是一些关于hash以及其相关的一些基本预备知识。

 

2.散列函数的安全性以及目前安全散列函数的发展。

  生日攻击:利用“两个集合相交”问题的原理生成散列函数碰撞,达到目的的攻击称为生日攻击,也称为平方根攻击。生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度。

  MD5安全性:MD5是一个较为古老的算法,一度被广泛应用于安全领域。比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。不过,由于MD5的弱点被不断发现以及计算机能力不断的提升,通过碰撞的方法有可能构造两个具有相同MD5的信息,使MD5算法在目前的安全环境下有一点落伍。从实践角度,不同信息具有相同MD5的可能性还是非常低的,通常认为是不可能的,通过碰撞的方法也很难碰撞出复杂信息的MD5数值。因此,MD5算法还是被广泛的用作检验文件是否变化的散列函数,很多类似迅雷、旋风这样的下载工具,都可以通过MD5来验证,用户下载下来的文件是否被修改。

  SHA-1:该算法的原始规范于1993年作为美国政府标准机构NIST(国家标准与技术研究院)的安全散列标准FIPS PUB 180发布。现在这个版本通常被称为SHA-0。它在出版后不久被国家安全局撤回,并被1995年发布的FIPS PUB 180-1修订版所取代,通常称为SHA-1。SHA-1与SHA-0的不同之处仅在于其压缩功能的消息调度中的单个按位旋转; 根据美国国家安全局的说法,这项工作已经完成,以纠正原有算法中的一个缺陷,从而降低了其密码安全性。然而,国家安全局并没有提供任何进一步的解释或确定哪些缺陷被纠正。随后在SHA-0和SHA-1中报告了弱点。SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者

 

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

  散列函数的安全要求:单向性:对任何给定的散列码h,找到满足H(x)=h的x在计算上是不可行的。
            抗弱碰撞性:对任何给定的消息x,找到满足y≠x且H(x)=H(y)的y在计算上是不可行的。
            抗强碰撞性:找到任何满足H(x)=H(y)的偶对(x,y)在计算上是不可行的。

  目前安全散列函数的发展:有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。Van Oorschot和Wiener曾经提出,花费1000万美元涉及一个被专门用来搜索MD5算法碰撞的机器,则平均24天内就可以找到一个碰撞。2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经呗彻底攻破。

 

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

  MD5:用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一,主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

  MD5算法具有以下特点:
  (1)压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  (2)容易计算:从原数据计算出MD5值很容易。
  (3)抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  (4)强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
  MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
  MD5的用处主要有一下几个场景:
  (1)数据完整性校验:检查数据有没有被篡改过,这里取个例子。当用Android手机进行OTA升级的时候,下载完升级包(不管是全升包还是增量包),紧接着就是用该升级包的标准MD5进行验证,如果校验的结果等于标准的MD5值,那么就证明这个升级包没有被篡改过。
  (2)不可逆的加密:

像Unix系统中,用户用用户名和密码登陆系统,由于系统中存放的是用户名和密码组合MD5校验值,所以登陆框将会把用户名和密码进行MD5算法从而生成用户名和密码组合的MD5校验值,系统由此可以知道能不能登陆成功。

  选择前缀碰撞:将碰撞合并到一对文件中时,除了构成碰撞的相对较小的随机查找字节块之外,构造碰撞的原始方法要求文件完全相等。前缀冲突只有在碰撞文件应该完全相等的要求。之前发现碰撞的两个文件的碰撞可以是任何事情:我们的选择前缀碰撞查找方法总是会产生一个碰撞,该碰撞可以合并到两个文件中,而不管在碰撞之前存在什么数据。

  可能出现的问题:如果有第三方在验证软件完整性时截取软件代码,使用快速MD5碰撞生成器,在短时间内伪造一份相同的MD5,并恶意篡改软件,那么安全性将会大大下降。当软件过大时,在验证过程中所需的时间也会大大增加,对于第三方而言,攻击的成功概率也会增加。无法定位给定的散列值,并生成一个(有意义的)输入位串哈希到给定的值。在加密术语中:我们的攻击是对抗碰撞的攻击,而不是对原像或第二原像的抵抗。这意味着,攻击者必须专门准备两个相互冲突的文件,然后才能在下载网站上发布或通过代码签名方案进行签名。已知散列的现有文件尚未用这种方法准备好,这些文件不容易受到攻击。 
然而,我们可以很容易地做的是在几个额外的字节上进行强力搜索,例如让散列值的前三个和最后三个字节与给定目标匹配。这已经可能引入额外的漏洞,因为很多人(包括我们中的至少两个人)通常在检查散列值时仅查看第一个和最后三个字节。 
为了滥用软件完整性保护或代码签名方案中的选择前缀冲突,攻击者应能够在文件被散列和/或签名之前对其进行操作。这可能意味着攻击者需要内部人员访问运行可信软件完整性保护或代码签名过程的一方。具有此类访问权限的攻击者无论如何都可能会造成更多伤害,而无需选择前缀冲突,从而获得恶意软件上的“官方”数字签名。 
另一方面,存在依赖方的观点,即用户下载哈希或签名的代码需要一些保证该软件是可信的。该依赖方无法确定发布的散列值或数字签名是否仅对他下载的可执行文件有效。很可能有一个具有相同散列值或数字签名的兄弟文件,而这些兄弟姐妹中只有一个经历了适当的散列或签名过程。特别是当软件完整性验证发生在引擎盖下时,由于用户不知道操作系统或某个隐藏的应用程序正在静默地验证要安装的软件上的数字签名, 

posted @ 2018-05-10 17:07  wyyue  阅读(604)  评论(0编辑  收藏  举报