目录
一、单向散列函数简介
单向散列函:又称为消息摘要函数、哈希(hash)函数或杂凑函数。有一个输入和一个输出,输入称为消息(原像),输出称为散列值(消息摘要、指纹);单向散列函数可通过消息计算出散列值,而散列值可用于检测消息的完整性
散列值与消息的长度无关,其长度永远为160bit(20字节);单向散列函数不需要知道消息代表的含义,只将其单纯
作为比特序列来处理
用于确认完整性,不需要比对消息本身,只需要比对计算出的散列值即可
单向散列函数的性质:
1)根据任意长度消息计算出固定长度的散列值
2)能快速计算出散列值(消息越长计算时间越长)
3)消息不同散列值也不同(只有1比特的改变,也会很高概率的产生散列值)
4)具备单向性(可根据消息计算散列值,但不能通过散列值反算消息)
碰撞:两个不同消息产生同一个散列值称为碰撞
抗碰撞性:指难以发现碰撞的性质
- 弱抗碰撞性(找到与该消息有相同散列值的一条消息是很困难的)
- 强抗碰撞性(找到与该消息有相同散列值的两条消息是很困难的)
二、单向散列函数的应用:
1)检测软件是否被篡改(用于验证散列值必须通过和软件包获取不同的、可信任的渠道去获取)
2)基于口令的加密(PBE,将口令和伪随机数生成器产生的随机值混合后计算器散列值,然后将这个散列值作为加密的密钥;使用该方法可抵御针对口令的字典攻击)
3)消息认证码(将发送者和接受者之间的共享密钥和消息进行混合或计算出的散列值;使用该方法可用于防止通信过程中的错误、篡改及伪装)
4)数字签名(计算消息的散列值,在对这个散列值进行数字签名;非常耗时)
5)伪随机数生成器(构造伪随机数生成器,并需要具备“不肯能根据过去的随机数列预测未来的随机数列”)
6)一次性口令(用于服务端对客户端的合法认证,并保证口令只在通信链路上传一次)
三、单向散列函数种类:
1)MD4、MD5
Message Digest:消息-摘要算法
MD4:于1990年设计,可产生128位的散列值。现已不安全
MD5:于1991年设计,可产生128位的散列值。现已不安全
2)SHA(安全散列算法)
SHA-1:于1993年设计,消息长度存在上限接近264比特,可产生160比特的散列值
SHA-2:包含SHA-256,SHA-384,SHA-512;其散列值长度分别为256、384、512,这些消息长度也存在上限分别为SHA-256接近2^64,SHA-384接近2^128
注:SHA-1的强抗碰撞性已于2005年被攻破
3)RIPEMD-160
于1996设计产生的能产生160比特的单向散列函数。RIPEMD-160是RIPEMD的修订版
注:RIPEMD的强碰撞性已于2004年被攻破
单向散列函数SHA-1介绍(可忽略):
SHA-1是一种能根据上限为2^64比特的消息计算出160比特的散列值的单向散列函数
1)填充
对消息进行填充处理,以512比特为一输入分组,使其长度为512比特的整数倍。输入SHA-1的消息应大于0小于2^64比特,在末尾添加多余的数据,是消息成为512比特的整数倍
2)计算W0~W79
根据输入分组的512比特计算出80个32比特的值(W0~W79)
3)分组处理
对输入分组依次进行80步骤的处理,计算5个32比特的值(A~E)作为SHA-1内部状态。对所有分组都进行的这一操作
4)单步处理
四、对单向散列函数的攻击:
1)暴力破解:寻找与原消息产生同一散列值的不同消息(一种试图破解单向散列函数的弱抗碰撞性的攻击)
2)生日攻击:并非寻找生成特定散列值的消息,而是找到散列值相同的两条消息,而散列值可为任意(一种试图破解单向散列函数的强抗碰撞性的攻击)
五、单向散列函数无法解决的问题:
单向散列函数只能识别出消息是否被篡改,无法识别发送消息的人是否伪装