散列函数的应用及其安全性
散列函数的应用及其安全性
一、散列函数
1.定义
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
2.散列函数的应用
Hash函数被广泛的应用于各种不同的安全应用和网络协议中
1、保证数据的完整性
就是用散列函数对数据或文件进行转换,生成一个散列码并保存,下次使用该数据和文件,同样进行散列函数计算得出结果与之比较,如果数据或文件被恶意篡改的,这两个值就不同了。以此发现病毒或入侵者。因为一个比特或几个比特被改变,它的hash结果就被改变。
2、单向数据加密
例子有口令加密,将用户口令的散列码存到一个表中,使用时将用户输入口令进行散列运算然后与准备好的散列表值进行对比,从而完成口令的有效验证。
3、数字签名
所谓数字签名(Digital Signature)(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
二.结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展
生日攻击:
利用“两个集合相交”问题的原理生成散列函数碰撞,达到目的的攻击称为生日攻击,也称为平方根攻击。 生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度。
散列函数的安全性:
- MD5和SHA-1算法已经被证明存在碰撞,MD5算法更是已经可以使用较短的时间进行破解,SHA-1的破解虽然还具有一定成本,但在被证明发生碰撞后,在计算机性能不断发展并且算法不断被改进的今天,破解的速度只会变得越来越快,SHA-1算法已经可以说是不安全的了。
- 由资料可知“生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度”,所以生日攻击对于所有种类的散列函数算法都有效果,增长Hash值的长度就可以抵御生日攻击。
安全散列函数
安全散列函数结构:
因为所需的安全散列长度越来越长,因此我们可以使用有限定义域上的散列函数(俗称压缩函数)通过迭代方式拓展为具有无限定义域的散列函数。而最为代表性的就Merkle-Damgard结构
这个结构的好处是,如果压缩函数是抗碰撞的,那经过此结构处理后的散列函数也是抗碰撞的。
SM3,HMAC就是基于这种结构,因为Merkle-Damgard结构并不能抵抗扩展攻击,因此HMAC引入了Key。
三.结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问题。
1两个不同的程序,MD5可能是相同的
2无法保证文件的来源可靠性,不能确认接收方接收到的文件与发送方的发出文件相同。
3如果安全软件在系统升级后没有考虑到双签名验证的情况,很有可能按照类似“正常”的逻辑判定这个恶意样本伪造的签名有效
4不能保证文件的完整性和正确性,文件可能被损坏。