一.散列函数的具体应用
(1)定义
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
(2)散列函数的应用
Hash函数被广泛的应用于各种不同的安全应用和网络协议中。
1、消息认证
消息认证:散列函数用于消息认证,函数值称为消息摘要,确保收到的数据和发送时的一样就是用散列函数对数据或文件进行转换,生成一个散列码并保存,下次使用该数据和文件,同样进行散列函数计算得出结果与之比较,如果数据或文件被恶意篡改的,这两个值就不同了。以此发现病毒或入侵者。因为一个比特或几个比特被改变,它的hash结果就被改变。
2、产生单向口令文件
3、数字签名
所谓数字签名(Digital Signature)(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
二.结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展
生日攻击:
定义:利用“两个集合相交”问题的原理生成散列函数碰撞,达到目的的攻击称为生日攻击,也称为平方根攻击。生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度。生日攻击的基本原理为假定散列函数H有种可能输出(即输出为位),H作用于k个随机输入,则时至少有一个重复出现,发生碰撞现象。
散列函数的安全性:
1.由资料可知“生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长度,即Hash值的长度”,所以生日攻击对于所有种类的散列函数算法都有效果,增长Hash值的长度就可以抵御生日攻击。
2.散列函数的安全性:其安全性有散列码长度决定,散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。首先输入长度可变;输入长度固定;效率;抗原像攻击(单向性);抗第二原像攻击(抗弱碰撞性);碰撞攻击(抗强碰撞性);
散列函数的目前发展:
有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。单向散列函数或者安全散列函数之所以重要,不仅在于消息认证(消息摘要,数据指纹),还有数字签名(加强版的消息认证)和验证数据的完整性。常见的单向散列函数有MD5和SHA。
三.结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问题。
MD5算法的选择前缀碰撞:如果两个文件存在任何碰撞(冲突)的地方,发生前缀碰撞后,这两个文件完全相同,即得到相同的MD5。第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的MD5消息摘要值相同,即文件内容不同,但是MD5相同,这说明MD5算法存在着不安全性。
问题:
1.文件的来源可靠性难以保证,接收方接收到的文件与发送方的发出文件相同也不能保证。
2.如果安全软件在系统升级后没有考虑到双签名验证的情况,很有可能按照类似“正常”的逻辑判定这个恶意样本伪造的签名有效,那就造成了错误。
3.文件的完整性和正确性可能遭到损坏。
4.当验证效率较低时,会出现验证时间过长,给中间攻击者的攻击行为提供足够的攻击时间而增加安全风险。