2016012009 马佳欣 散列函数的应用及其安全性

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

                                                                   马佳欣  2016012009

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

由于散列函数的应用的多样性,它们经常是专为某一应用而设计的。例如,加密散列函数假设存在一个要找到具有相同散列值的原始输入的敌人。一个设计优秀的加密散列函数是一个“单向”操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。为加密散列为目的设计的函数,如MD5,被广泛的用作检验散列函数。这样软件下载的时候,就会对照验证代码之后才下载正确的文件部分。此代码有可能因为环境因素的变化,如机器配置或者IP地址的改变而有变动。以保证源文件的安全性。

错误监测和修复函数主要用于辨别数据被随机的过程所扰乱的事例。当散列函数被用于校验和的时候,可以用相对较短的散列值来验证任意长度的数据是否被更改过。

错误校正

使用一个散列函数可以很直观的检测出数据在传输时发生的错误。在数据的发送方,对将要发送的数据应用散列函数,并将计算的结果同原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,如果两次散列函数计算出来的结果不一致,那么就说明数据在传输的过程中某些地方有错误了。这就叫做冗余校验。

对于错误校正,假设相似扰动的分布接近最小(a distribution of likely perturbations is assumed at least approximately)。对于一个信息串的微扰可以被分为两类,大的(不可能的)错误和小的(可能的)错误。我们对于第二类错误重新定义如下,假如给定 H(x) 和 x+s,那么只要s足够小,我们就能有效的计算出x。那样的散列函数被称作错误校正编码。这些错误校正编码有两个重要的分类:循环冗余校验和里德所罗门码。

语音识别

对于像从一个已知列表中匹配一个MP3文件这样的应用,一种可能的方案是使用传统的散列函数——例如MD5,但是这种方案会对时间平移、CD读取错误、不同的音频压缩算法或者音量调整的实现机制等情况非常敏感。使用一些类似于MD5的方法有利于迅速找到那些严格相同(从音频文件的二进制数据来看)的音频文件,但是要找到全部相同(从音频文件的内容来看)的音频文件就需要使用其他更高级的算法了

那些并不紧随IT工业潮流的人往往能反其道而行之,对于那些微小差异足够鲁棒的散列函数确实存在。现存的绝大多数散列算法都是不够鲁棒的,但是有少数散列算法能够达到辨别从嘈杂房间里的扬声器里播放出来的音乐的鲁棒性。有一个实际的例子是Shazam[1]服务。用户可以用电话机拨打一个特定的号码,并将电话机的话筒靠近用于播放音乐的扬声器。该项服务会分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较。用户就能够收到被识别的音乐的曲名(需要收取一定的费用)。

信息安全

Hash算法在信息安全方面的应用主要体现在以下的3个方面:

(1)文件校验

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

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

(2)数字签名

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

(3) 鉴权协议

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

 

(2)散列函数的安全性以及目前安全散列函数的发展

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

安全散列函数:

 

大部分安全哈希函数都是迭代结构的。图中Mi为被分成L块的原始信息,f为杂凑函数,IV为初始值。填充信息和IV的选择对哈希函数的安全性有很大影响,任何两条消息都不能被填充成相同的消息,填充的末尾应该加上消息的长度;IV的选择定义为该哈希函数描述的一部分。

安全散列函数的发展:目前使用最多的哈希函数有MD(Message-Digest Algorithm)系列(MD4、MD5、HAVAL、RIPEMD)和SHA系列(SHA-1、SHA-256)

MD4 

1990年Ronald L. Rivest设计,通过3圈的操作将任意长度的消息变换成128位的哈希值。MD4算法的前两圈已被Dobbertin等人攻破,证明MD4算法是不安全的,但整个算法并没有被攻破过。具体算法详见《MD4算法分析》

MD5

MD5是Rivest于1991年对MD4的改进版本。它对输入仍以512位分组,经过一系列处理后,其输入是4个32位字的级联,于MD4相同。MD5算法被王小云证明是可攻破的,因此也已经不安全了。
MD5与MD4的区别:MD5用了4轮变换,比MD4多一轮;MD4中第一轮没有常量加,MD5中64步每一步用了一个不同的常量K[i];MD5每轮加上前一步的结果,MD4没有。
MD5首先对数据进行填充,使其成为512的倍数。

 

上图中的每个HMOS 进行4轮运算,每轮包括16次操作,每次操作的流程图如图所示

 

Mi表示一个32 位的输入消息分组(16*32=512),K i表示一个32 位常数,用来完成每次不同的计算,<<<s 表示向左位移s位。图中的F是一个非线性函数,四轮中的F函数各不相同,分别为:

  F(X,Y,Z) =(X&Y)|((~X)&Z)

  G(X,Z)=(X&Z) |(Y&(~Z))

  H(X,Y,Z) =X^Y^Z

  I(X,Y,Z) =Y^(X|(~Z))

每轮中的16次运算的参数也不相同,详见百度百科。

HAVAL

HAVAL是MD5的改进反本,其轮数可以是3.4或5(年轮16步).输出长度分别为128、160、192或224位。HAVAL用高非线性-7变量函数取代了MD5的简单非线性函数。

SHA1
SHA由美国国家标准技术研究所NIST 开发,于1993 年发表,SHA-1是基于MD4 设计的输入最大长度为2^64位的数据,输出160位的消息摘要,同样以512位数据块进行处理,具体这里不详述
SHA-256
输出由SHA-1的160位扩大到256 位,迭代次数由SHA-1的80次增加到128次

SHA-384
输出扩大到384位,迭代次数增加到192次
SHA-5 12
输出扩大到512位,迭代次数增加到256次

 

 

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

md5是一种不可逆的加密算法,也就是说除了穷举外只根据密文不可能得到明文。md5一般有两种用途:第一个是例如对数据库里保存的密码加密,另一个就是你说的校验、检错。md5的一个性质就是明文哪怕改动一点点,所得到的密文就会与之前完全不同,所以可以验证文件的完整性。
问题:MD5摘要算法,公钥加密只对消息摘要进行操作,因为一种摘要算法的摘要消息长度是固定的,而且都比较“短”(相对于消息而言),正好符合公钥加密的要求。这样效率得到了提高,而其安全性也并未因为使用摘要算法而减弱。

 

posted @ 2018-05-11 21:41  叁秒  阅读(362)  评论(0编辑  收藏  举报