散列函数的应用及其安全性
一、 散列函数(哈希函数,Hash Function)的应用。
1、 判断文本是否完整的校验。
目前应用最为广泛的hash函数是SHA-1和MD5,大多是128位和更长。hash函数在现实生活中应用十分广泛。很多下载网站都提供下载文件的MD5码校验,可以用来判别文件是否完整,在一些BitTorrent下载中,软件将通过计算MD5检验下载到的文件片段的完整性。
2、 实现口令,密码等安全数据的安全存储
密码等很多关键数据我们需要在数据库中存储,但是在实际运用的过程中,只是作比较操作,顾而我们可以比较HASH结果。
3、 有限固定摘要长度
数字签名正是运用了这些特点来提高效率的。我们知道非对称加密算法速度较低,通过HASH处理我们可以使其仅仅作用于HASH摘要上,从而提高效率。
4、 运用HASH到随机数的生成和密码,salt值等的衍生中
因为HASH算法能够最大限度的保证其唯一性,故而可以运用到关键数据的衍生中(从一个随机的种子数产生,并且不暴露种子本身秘密)。
二、 散列函数的安全性问题和发展:
原因:哈希碰撞:两个不同的输入,经过哈希算法后,得到了同样的哈希值,就叫做哈希碰撞。
由于通常的哈希算法中,哈希值的空间远小于输入的空间,这就意味着信息熵有丢失。
一个空间较大的集合(输入)通过哈希算法映射到一个空间较小的集合(哈希值),必然会造成多个输入映射到一个哈希值上,这就是所谓的哈希碰撞。
例子:生日攻击。
首先理解生日悖论:
生日悖论:如果一个房间里有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算法在验证软件完整性时可能出现的问题。:
MD5是哈希的一种。
哈希就是把任意长度的输入,通过散列算法,变换成固定长度的输出。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
MD5是消息摘要,消息摘要是哈希算法的一种应用,而消息摘要算法是一种碰撞要求极其严格的哈希算法
这些信息摘要算法通常散列都十分均匀,且不容易产生哈希碰撞。由此,我们可以
用MD5的压缩来作为软件的完整性验证。
但是,在使用MD5算法来验证完整性时,由于MD5算法是公开的,所有人都可以获得和使用MD5算法,那就意味着别人可以利用相同的算法针对你的加密值不断地进行计算。如果不对MD5算法进行一些处理,那么当我们将自己的重要接口暴露在互联网上的时候,比如登陆接口,攻击者就可以同样利用MD5加密算法对我们进行撞库攻击和关键信息比对。
而这,也就是md5算法在验证软件完整性时可能出现的问题。