哈希算法索引

哈希函数(Hash Function)是一种将任意长度的数据映射为固定长度摘要值的函数。 哈希算法广泛应用于数据完整性校验、数字签名、密码存储、数据索引、分布式系统等领域。 本页是基础哈希算法的系统索引,涵盖校验和算法、密码学哈希、快速非加密哈希等主要类别。

简介

哈希函数根据其设计目标和安全属性,可分为密码学哈希函数非加密哈希函数两大类。 密码学哈希函数要求具备抗原像攻击(Preimage Resistance)、抗第二原像攻击(Second Preimage Resistance)和抗碰撞攻击(Collision Resistance)等安全属性, 而非加密哈希函数则主要追求计算速度和良好的分布性。

评价哈希算法的主要指标包括:输出长度(决定了理论安全上限)、计算速度安全性(是否已发现碰撞攻击)、雪崩效应(输入微小变化导致输出大幅变化的程度)以及 硬件友好性(是否适合硬件加速实现)。

分类

哈希算法按用途可分为以下几个主要类别:

类别典型算法主要用途
校验和算法CRC, Adler-32, Fletcher数据传输错误检测
密码学哈希SHA-256, SHA-3, BLAKE3, MD5(已弃用)数字签名、完整性验证
快速哈希xxHash, MurmurHash, CityHash, FarmHash哈希表、数据分片、校验
国密算法SM3中国国家标准密码学应用
密码哈希bcrypt, scrypt, Argon2, PBKDF2密码安全存储
消息认证SipHash, HMAC消息认证码、防哈希洪水攻击
校验和算法
密码学哈希函数
快速非加密哈希
国密算法
密码哈希函数

密码哈希函数(Password Hashing Function)通过增加计算成本(CPU、内存)来减缓暴力破解速度,专门用于安全存储用户密码。

bcrypt
bcrypt Password Hashing
Niels Provos 于 1999 年设计的密码哈希算法,基于 Blowfish 加密算法,内置盐值(salt)和可调成本因子。至今仍被广泛使用。
密码存储 1999 184 bit
scrypt
scrypt Key Derivation
Colin Percival 于 2009 年设计的密钥派生函数,需要大量内存,有效抵抗 GPU/ASIC 攻击。被 Litecoin 等加密货币采用。
密码存储 2009 可变长度
Argon2
Argon2 / Argon2d / Argon2i / Argon2id
2015年密码哈希竞赛冠军,支持可调的CPU、内存和并行度参数。Argon2id 是目前推荐的密码哈希首选方案。
密码存储 推荐 2015 可变长度
PBKDF2
Password-Based Key Derivation Function 2
RSA Laboratories 提出的标准密钥派生函数,通过迭代 HMAC 实现密钥加强。被 WPA2、iOS、Windows 等广泛采用。
密码存储 2000 可变长度
其他算法
算法全称输出年份备注
MD2Message-Digest Algorithm 2128 bit1989Rivest 设计,已弃用
MD4Message-Digest Algorithm 4128 bit1990Rivest 设计,已严重破解
HAVALHAVAL Hash128~256 bit1992可变轮数,已发现碰撞
TigerTiger Hash Function192 bit1995Anderson/Biham 设计,针对64位优化
GOSTGOST R 34.11-94 / -2012256/512 bit1994俄罗斯国家标准
FNVFowler-Noll-Vo32~1024 bit1991简单快速的非加密哈希
DJB2Daniel J. Bernstein Hash32 bit1991经典字符串哈希
JenkinsJenkins hash (one-at-a-time)32 bit1997Bob Jenkins 设计的简单哈希
SpookyHashSpookyHash64/128 bit2011Bob Jenkins 设计的高速哈希
MetroHashMetroHash64/128 bit2015针对现代CPU优化
HighwayHashHighwayHash64/256 bit2017Google 设计,利用 SIMD 指令
性能对比

以下是常见哈希算法在现代 x86-64 平台上的大致性能参考(单线程,大输入):

算法输出长度类型速度 (GB/s)安全性
BLAKE3256 bit密码学~7.0安全
XXH364/128 bit非加密~11.0不适用
xxHash6464 bit非加密~9.5不适用
MurmurHash332/128 bit非加密~5.5不适用
BLAKE2b512 bit密码学~3.5安全
BLAKE2s256 bit密码学~3.0安全
SHA-256256 bit密码学~1.8安全
SM3256 bit密码学~1.5安全
SHA-512512 bit密码学~2.5安全
SHA-3-256256 bit密码学~1.2安全
MD5128 bit密码学~3.5已破解
CRC-3232 bit校验和~15.0不适用
SHA-1160 bit密码学~2.5已破解
RIPEMD-160160 bit密码学~1.5安全
Whirlpool512 bit密码学~1.0安全

注:速度数据为近似参考值,实际性能因平台、实现和输入大小而异。BLAKE3 支持多线程并行加速。

发展时间线
年份事件
1961CRC 概念由 W. Wesley Peterson 提出
1989MD2 发布(Rivest)
1990MD4 发布(Rivest)
1991FNV 哈希设计;DJB2 发布
1992MD5 发布(Rivest);RIPEMD 开发
1993SHA-0 发布(NIST)
1995SHA-1 发布;Tiger 发布;Adler-32 随 zlib 发布
1996RIPEMD-160 发布
1999bcrypt 发布
2000PBKDF2 标准化(RFC 2898);Whirlpool 发布
2001SHA-2 系列(SHA-256 等)发布
2004王小云团队发布 MD5 碰撞攻击
2008MurmurHash 发布;BLAKE 参与 SHA-3 竞赛
2009scrypt 发布;Bitcoin(使用 SHA-256)上线
2011SHA-3 竞赛决出 Keccak 为获胜者;CityHash 发布
2012SHA-3 标准化;BLAKE2 发布;SipHash 发布;xxHash 发布;SM3 成为国家标准
2015Argon2 赢得密码哈希竞赛;FarmHash 发布
2017SHA-1 首次实际碰撞攻击(SHAttered);HighwayHash 发布
2019XXH3 发布
2020BLAKE3 正式发布
参考文献
  1. Peterson, W.W. and Brown, D.T. (1961). "Cyclic Codes for Error Detection". Proceedings of the IRE. 49 (1): 228–235.
  2. Rivest, R. (1992). "The MD5 Message-Digest Algorithm". RFC 1321.
  3. NIST (2001). "Secure Hash Standard (SHS)". FIPS PUB 180-2.
  4. NIST (2015). "SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions". FIPS PUB 202.
  5. Aumasson, J.-P., Neves, S., Wilcox-O'Hearn, Z., Winnerlein, C. (2013). "BLAKE2: simpler, smaller, fast as MD5".
  6. O'Connor, J., Aumasson, J.-P. (2020). "BLAKE3: one function, fast everywhere".
  7. Collet, Y. (2019). "xxHash - Extremely Fast Hash Algorithm". GitHub Repository.
  8. Appleby, A. (2008). "MurmurHash3". Retrieved from github.com/aappleby.
  9. 国家密码管理局 (2010). "SM3 密码杂凑算法". GM/T 0004-2012.
  10. Aumasson, J.-P. and Bernstein, D.J. (2012). "SipHash: a fast short-input PRF".
  11. Biryukov, A., Dinu, D., Khovratovich, D. (2016). "Argon2: the memory-hard function for password hashing and other applications".
  12. Wang, X., Yu, H. (2005). "How to Break MD5 and Other Hash Functions". EUROCRYPT 2005.
  13. Stevens, M., Bursztein, E., Karpman, P., Albertini, A., Markov, Y. (2017). "The first collision for full SHA-1". CRYPTO 2017.
参见