目录
7.4.2 SHA-1、SHA-256、SHA-384、SHA-512
7.4.4 AHS(Advanced Hash Standard)与SHA-3
单向散列函数是用来确保完整性的。
7.1 本章学习的内容
单项散列函数的介绍;
SHA-1、SHA-2、SHA-3;
7.2 什么是单向散列函数
7.2.2 什么是单向散列函数
单向散列函数有一个输入和一个输出,其中输入称为消息,输出称为散列值,这里的消息可以是字符串,也可以是图像文件、声音文件等等。
散列值的长度和消息的长度无关,单向散列函数总是会计算出固定长度的散列值。比如 SHA-1 单向散列函数,它计算出的散列值的长度永远是160比特(20字节)。
单向散列函数必须确保要找到和该消息具有相同散列值的另外一条消息是非常困难的,这一性质称为弱碰撞性。
7.2.3 单向散列函数的性质
- 根据任意长度的消息计算出固定长度的散列值。
- 能够快速计算出散列值。
- 消息不同,散列值也不同。抗碰撞性
- 具备单向性。(one-way)
7.2.4 关于术语
单向散列函数,也称为消息摘要函数、哈希函数或者杂凑函数。
7.3 单向散列函数的实际应用
7.3.1 检测软件是否被篡改
在镜像网站发布软件,将计算的散列值和原始网站的散列值进行对比。
7.3.2 基于口令的加密
PBE:将口令和盐(salt,通过伪随机数生成器产生的随机数)混合后计算其散列值。
7.3.3 消息认证码
将“发送者和接收者之间的共享密钥”和“消息”进行混合后计算出的散列值。在SSL/TLS中得到应用,将在14章详细介绍。
7.3.4 数字签名
第9章详细介绍。
7.3.5 伪随机数生成器
可使用单向散列函数构造伪随机数生成器。详见第12章。
7.3.6 一次性口令
可以使用单向散列函数构造一次性口令。
7.4 单向散列函数的具体例子
- MD4,MD5
- SHA-1,SHA-256,SHA-384,SHA-512(SHA-256,SHA-384,SHA-512统称为SHA-2)
- RIPEMD-160
- AHS与SHA-3
7.4.1 MD4、MD5
MD4、MD5的输出散列值都是128比特,MD是Message Digest的缩写。
7.4.2 SHA-1、SHA-256、SHA-384、SHA-512
SHA-2有6个版本,都是由SHA-256\SHA-512这两个版本衍生出来的。
注意,SHA-224和SHA-256在实现上采用32x8比特的内部状态,更适合32位的CPU
散列函数 | 名称 | 输出长度(bit) | 内部状态长度 | 备注 |
SHA-1 | / | 160 | ||
SHA-2 | SHA-224 | 224 | 32x8 = 256 | 将SHA-256的结果截掉32比特。 |
SHA-256 | 256 | 32x8 = 256 | ||
SHA-512/224 | 224 | 64x8 = 512 | 将SHA-512的结果截掉288比特 | |
SHA-512 | 256 | 64x8 = 512 | 将SHA-512的结果截掉256比特 | |
SHA-384 | 384 | 64x8 = 512 | 将SHA-512的结果截掉128比特 | |
SHA-512 | 512 | 64x8 = 512 |
7.4.3 RIPEMD-160
RIPEMD的强抗碰撞性已于2004年被攻破,但是RIPEMD-160还尚未被攻破。比特币中使用的就是RIPEMD-169(15.3节)。
7.5 单向散列函数SHA-3
SHA-3(Keccak算法)
7.6 Keccak算法
暂时跳过,有兴趣的请移步——>详解常用哈希函数(Keccak算法)
7.7 应该使用哪种单向散列函数
MD5:不安全,不应该使用
SHA-1:不应该用于新的用途
SHA-2:可以使用
SHA-3:可以使用
7.8 对单向散列函数的攻击
- 暴力破解
- 生日攻击
7.9 单向散列函数无法解决的问题
能够识别出“篡改”,无法辨别出“伪装”。
需要认证:消息认证码、数字签名