散列函数及其应用
Posted lirc331
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了散列函数及其应用相关的知识,希望对你有一定的参考价值。
一、散列函数是什么?
1.中文名称:哈希函数 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
2.散列函数构造方法
1. 直接定址法:例如:有一个从1到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。
2.数字分析法:
有学生的生日数据如下:
年.月.日
75.10.03
75.11.23
76.03.02
76.07.12
75.04.21
76.02.15
...
经分析,第一位,第二位,第三位重复的可能性大,取这三位造成冲突的机会增加,所以尽量不取前三位,取后三位比较好
3.平方取中法:取关键字平方后的中间几位为哈希地址。
4.折叠法:将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这方法称为折叠法
5.除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。
6.随机数法:选择一个随机函数,取关键字的随机函数值为它的哈希地址,即H(key)=random(key),其中random为随机函数。通常用于关键字长度不等时采用此法。
二、散列函数的应用
1、消息认证:散列函数用于消息认证,函数值称为消息摘要,确保收到的数据和发送时的一样就是用散列函数对数据或文件进行转换,生成一个散列码并保存,下次使用该数据和文件,同样进行散列函数计算得出结果与之比较,如果数据或文件被恶意篡改的,这两个值就不同了。以此发现病毒或入侵者。因为一个比特或几个比特被改变,它的hash结果就被改变。
Hash函数用于消息认证的方法:
·使用对称密码算法加密消息和Hash码
·使用对称密码算法只对Hash码进行加密
·不使用加密算法,仅使用Hash函数也能够实现消息认证
·通过将整个消息和Hash值加密
2、产生单向口令文件:当用户输入口令时,操作系统将对比输入口令的Hash值和存储在口令文件中的Hash值
3、数字签名:所谓数字签名(Digital Signature)(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
4、用于入侵检查和病毒检测:将每个文件的Hash值H(F)存储在安全系统中,然后就能够通过重新计算H(F)来判断文件是否被修改过,入侵者只能够改变F,而不能够改变H(F)
5、随机数的生成和密码,salt值等的衍生:因为HASH算法能够最大限度的保证其唯一性,故而可以运用到关键数据的衍生中(从一个随机的种子数产生,并且不暴露种子本身秘密)。
散列函数安全性
2.第二原像稳固性。给定x,很难找到一个x’,满足h(x)=h(x’)。
3.碰撞稳固性。很难找到满足h(x)=h(x’)的二元组(x,x’)。
这其中解决第三个问题碰撞问题的难度是最小的,目前对md5、sha1的攻击也基本都是在寻找碰撞。
目前发展:
2005年MD5的攻破似乎宣告了SHA或许为仅存的安全散列算法。
SHA-0:SHA由美国标准与技术研究所(NIST)设计并于1993年发表,该版本称为SHA-0,由于很快被发现存在安全隐患,
SHA-1:1995年发布了SHA-1。
SHA-2:2002年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称SHA-2。2008年又新增了SHA-224。
由于2017年SHA-1算法的攻破,目前已经有多家科技企业宣布逐步放弃SHA-1算法,微软已经确定会放弃在Edge以及IE浏览器上继续使用SHA-1算法的TLS证书,Google的Chrome在56版之后也会提示SHA-1加密的HTTPS网页并不安全,Mozilla则确定在今年7月开始停止SHA-1的支持。目前SHA-2各版本已成为主流。
三、结合生日攻击、以及2004、2005年王晓云教授有关MD5安全性和2017年google公司SHA-1的安全性,说明散列函数的安全性以及目前安全散列函数的发展
1.生日攻击:
(1)利用“两个集合相交”问题的原理生成散列函数碰撞,达到目的的攻击称为生日攻击,也称为平方根攻击。生日攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于消息摘要的长 度,即Hash值的长度。这种攻击对Hash函数提出了一个必要的安全条件,即消息摘要必须足够长。
(2) 防范方法
1、使用安全的Hash算法:安全的Hash算法生成的Hash值有足够多的位数。这样,攻击者在寻找两个具有相同Hash值的文件时就会非常困难。
加盐:在为文件签名之前,先向文件添加一个随机值,然后计算Hash值,再将文件、签名和随机值一起发送给接收者。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难。
3、改动文件:在为文件签名之前,对消息或文件做少许改动。这样,攻击者必须找出具有特定Hash值的伪造文件,这非常困难
2.MD5安全性和SHA-1的安全性
MD5安全性:用于保证信息传输完整一致,让大容量信息在用数字签名软件签署私人密钥前被“压缩”成一种保密的格式。
2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经被彻底攻破。后来Google公司宣 布实现了对SHA-1算法的攻击。SHA-1算法宣告攻破。不过需要注意的是,这次SHA-1算法破解的计算量相当于单个CPU计算6500年和单个GPU计算110年,因此就目前的PC硬件来看, 依靠一台电脑完成破解是不现实的。然而密码学家认为,如果利用云计算技术来破解的话,这件事情将简单很多,可能只需要17万美元的预算即可完成,因此尽快改用安全性更高的SHA-2 或SHA-3算法才是正确的做法。
SHA-1的安全性:主要用于数字签名标准里面定义的数字签名算法。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
但在2017.02.23,Google宣布了SHA-1算法碰撞方法,攻破SHA-1算法。
三、结合md5算法中的选择前缀碰撞以及第二个链接中的helloworld.exe和goodbyworld.exe两个可执行文件的md5消息摘要值和两个文件的执行结果说明md5算法在验证软件完整性时可能出现的问题。
MD5:Message Digest Algorithm MD5 为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格 式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
软件完整性:
1.软件在运行状态下,代码、金泰数据、动态数据和栈,必须保证不被未经授权的修改
2.软件控制流完整性
MD5在软件完整性出现的问题:
1.不同的程序也会有相同的MD5
2.不能确定网站是否被黑客入侵篡改,是否被植入病毒或木马
3.当软件过大时,在验证过程中所需的时间也会大大增加,对于第三方而言,攻击的成功概率也会增加。
4.如果有第三方在验证软件完整性时截取软件代码,使用快速MD5碰撞生成器,在短时间内伪造一份相同的MD5,并恶意篡改软件,那么安全性将会大大下降。
以上是关于散列函数及其应用的主要内容,如果未能解决你的问题,请参考以下文章