从零开始了解 TLS 1.3 系列笔记(三)—— 实用密码学之「哈希函数」
- 哈希函数将任意大小的输入数据不可逆地映射为固定大小的结果, 该结果称为哈希值.
- 加密哈希函数, 如 SHA-2 等则还要求映射冲突的发生概率非常低, 以至于在实际应用中可以忽略不计. 不可逆性和抗冲突性共同保证了无法伪造数据和原始数据具备一致的哈希值.
- 现代哈希函数包括 SHA-2, SHA-3, BLAKE2 等; 应当避免使用 MD5, SHA-1 等被认为不安全的哈希函数.
本文介绍了哈希函数的基本概念, 以及常见的安全哈希算法. 在计算机编程中, 哈希函数将字节串输入不可逆地映射到一个整数. 通常不同的输入映射到不同的输出; 在密码学中, 哈希函数将任意大小的输入数据转换为固定大小的结果, 该结果称为哈希值. 计算机密码学中使用的哈希函数称为 “加密哈希函数”. 对于哈希函数, 我们期待不同输入映射到不同输出, 但由于输入空间无限而输出空间有限, 有时也可能会发生冲突 (也称哈希碰撞, collision, 即不同的输入具有相同的输出). 对于加密哈希函数, 则要求冲突的发生概率非常低, 以至于在实际应用中可以忽略不计. 一个理想的加密哈希函数应当具有如下特性: 现代加密哈希函数, 如 SHA-2 和 SHA-3, 都满足上述特性. 哈希函数有很多应用, 其中最常见的包括: 加密哈希函数被广泛用于文件完整性校验. 如果你从网上下载的文件计算出的 SHA256 校验和 (checksum) 跟官方公布的一致, 那就说明文件没有损坏. 但是哈希函数自身不能保证文件的真实性, 目前来讲, 从网上下载的文件的真实性通常是 TLS 协议要保证的, 它确保你看到的网站所公布的「SHA256 校验和」是未被篡改的. 加密哈希函数还被用于密码的安全存储. 应当使用专门设计的安全哈希算法, 如 Scrypt, 计算用户密码的哈希摘要再持久化保存, 这样能确保密码的安全性. 除了用户自己, 没有人清楚该密码的原始数据. 将文件内容等哈希化, 可以生成一个唯一 ID, 用以索引等. 哈希函数也可以用来生成伪随机数, 例如, 可以将一个随机种子值(从随机事件中收集熵, 如随机的鼠标移动或键盘输入)并附加一个值然后哈希化, 得到一个伪随机数. 可将结果附加一个值再哈希化, 得到另一个伪随机数 (密钥派生的思想). 略. 以下简要介绍几种常见的安全哈希算法. 依据哈希位数, 可分为 SHA-256, SHA-384 和 SHA-512 等若干变体. SHA-2 基于 “Merkle-Damgård 构造” , 被认为高度安全. 示例: 比 SHA-2 更安全, 不容易遭受长度扩展攻击. BLAKE2 是一种更快的加密哈希函数, 其安全性与 SHA-3 相当. BLAKE2 有两个主要变体: BLAKE2b (适用于 64 位平台) 和 BLAKE2s (适用于 32 位平台). 该哈希函数相对少用. 如中国的商密系列 SM3 / SM4 等. 应当避免使用以下被认为不安全或安全性有争议的的哈希算法: MD2、MD4、MD5、SHA-0、SHA-1、Panama、HAVAL (有争议的安全性, HAVAL-128 发现冲突)、Tiger (有争议, 发现弱点)、SipHash (它不是加密哈希函数).哈希函数
加密哈希与冲突
哈希函数应用
安全哈希算法
SHA-2
SHA-256('hello') = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-384('hello') = 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f
SHA-512('hello') = 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
SHA-3
BLAKE2
其他
不安全的哈希函数