散列函数安全性的知识扩展

要求:

(1)给出散列函数的具体应用。

(2)结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展。问题2的回答可以结合下面给出的第一个链接。

(3)结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法来验证软件完整性时可能出现的问题。

 

一、散列函数的具体应用

 

Hash(散列函数),一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。由于散列函数的应用的多样性,它们经常是专为某一应用而设计的。正确的应用场景:
    1,数据校验
    HASH函数有类似数据冗余校验类似的功能,但是它比简单的冗余校验碰撞的概率要小得多,顾而在现在密码学中总是用HASH来做关键数据的验证。
    2,单向性的运用
    利用HASH函数的这个特点,我们能够实现口令,密码等安全数据的安全存储。密码等很多关键数据我们需要在数据库中存储,但是在实际运用的过程中,只是作比较操作,顾而我们可以比较HASH结 果。这一点相信在银行等系统中有所运用,否则我们真的要睡不着觉了:)
    3,碰撞约束以及有限固定摘要长度
    数字签名正是运用了这些特点来提高效率的。我们知道非对称加密算法速度较低,通过HASH处理我们可以使其仅仅作用于HASH摘要上,从而提高效率。
    4,可以运用HASH到随机数的生成和密码,salt值等的衍生中
    因为HASH算法能够最大限度的保证其唯一性,故而可以运用到关键数据的衍生中(从一个随机的种子数产生,并且不暴露种子本身秘密)。

 

二、结合生日攻击、以及20042005年王晓云教授有关MD5安全性和2017google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展

 

原因:哈希碰撞:两个不同的输入,经过哈希算法后,得到了同样的哈希值,就叫做哈希碰撞。

由于通常的哈希算法中,哈希值的空间远小于输入的空间,这就意味着信息熵有丢失。

一个空间较大的集合(输入)通过哈希算法映射到一个空间较小的集合(哈希值),必然会造成多个输入映射到一个哈希值上,这就是所谓的哈希碰撞。

例子:生日攻击

首先理解生日悖论:

生日悖论:如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。对于60人以上,这种概率要大于99%。

严格意义上,这并不是一个悖论,称之为悖论是由于跟人们的常识相悖。
生日攻击是以概率论中的生日问题为数据基础的一种密码学攻击方法。

根据生日悖论,如果哈希值的位数过短,很容易可以找到一组(两个)哈希值相同的输入,这就是一种最常用的生日攻击的应用。

使用一个64位的哈希函数,大约有 1.8 × 10^19 个不同的哈希值。
如果产生每个哈希值的可能性是相同的,那么只需大约 5.1 x 10^9 次(51亿次)暴力尝试就可以得到一次哈希碰撞。

例子:王晓云破解MD5

MD5最大的问题在于,通过我国的王晓云教授等学者的工作,md5已经被证明可以进行碰撞攻击。也就是说,攻击者可以产生两个应用程序,内容不一样,但是哈希值完全一样。

  在云存储的应用场合中,这种危害表现为攻击者可以伪造一个Windows 的安装光盘,在其中嵌入木马,通过上述手段让MD5哈希值和微软官方发布的光盘一致,抢先上传到分享类网盘中。如果该网盘采用MD5检查重复文件(例如离线下载服务), 木马就会被植入到希望下载原版光盘用户的电脑中。

  这种攻击形式不是天方夜谈,根据微软官方的报告,一款名为Flame的木马就用了类似的手段。当然,这种方式目前还是非常高级的攻击手段。

散列函数的发展:

 MD5 和 SHA1 是目前应用最广泛的Hash算法

 SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于2^64位的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。

最新的发展为:在使用安全哈希算法时,考虑使用SHA-2系列算法乃至更高级别算法,而不是MD5

 

三、结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exegoodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明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-13 22:49  枫叶下丶陌  阅读(201)  评论(0编辑  收藏  举报