哈希函数在安全领域无处不在——从密码存储到区块链,从文件完整性到数字签名。本文解释哈希函数的工作原理、应该使用哪种算法以及哪些应该避免。
什么是密码学哈希函数?
哈希函数接受任意大小的输入,产生固定大小的输出(哈希值或摘要)。密码学哈希函数还具有以下特性:
- 确定性:相同输入始终产生相同输出
- 单向性:无法从哈希值反推输入
- 雪崩效应:输入微小变化 → 输出完全不同
- 抗碰撞性:在计算上不可能找到两个具有相同哈希值的输入
常用哈希算法
MD5 —— 已被破解,避免用于安全场景
- 输出:128 位(32 个十六进制字符)
- 状态:密码学上已被破解(碰撞可在秒级内找到)
- 仍可用于:非安全校验和、遗留系统、文件去重
- 绝不用于:密码存储、数字签名、安全关键应用
SHA-1 —— 已废弃
- 输出:160 位(40 个十六进制字符)
- 状态:已被破解(2017 年 SHAttered 攻击找到碰撞)
- 已从 TLS 1.3 中移除
- 绝不用于:新的安全应用
SHA-256 —— 现代安全的主力算法
- 输出:256 位(64 个十六进制字符)
- SHA-2 系列的一部分
- 用于:比特币、TLS 证书、代码签名、JWT(HS256/RS256)
- 状态:安全,广泛信任
- 适用于:通用安全、数字签名、HMAC
SHA-384 / SHA-512 —— 更高安全性的 SHA-2
- 输出:384 / 512 位
- 在 64 位系统上比 SHA-256 更快
- 用于:高安全性应用、政府系统
- 状态:安全
SHA-3(Keccak)—— NIST 标准,不同设计
- 输出:224/256/384/512 位
- 与 SHA-2 完全不同的内部结构(海绵结构)
- 作为 SHA-2 被破解时的备用方案设计
- 状态:安全,部署不如 SHA-2 广泛
BLAKE2 —— 快速且安全
- 输出:可变(最大 512 位)
- 在现代硬件上比 MD5 更快,同时保持安全
- 用于:WireGuard、密码哈希(Argon2 内部使用)
- 状态:安全,推荐用于性能敏感场景
SM3 —— 中国国家标准
- 输出:256 位
- 中国政府和金融系统强制要求
- 安全性与 SHA-256 相当
- 状态:安全
哈希算法对比
| 算法 | 输出 | 速度 | 安全性 | 用途 |
|---|---|---|---|---|
| MD5 | 128 位 | 极快 | 已破解 | 仅校验和 |
| SHA-1 | 160 位 | 快 | 已破解 | 仅遗留系统 |
| SHA-256 | 256 位 | 良好 | 强 | 通用 |
| SHA-512 | 512 位 | 良好(64位) | 强 | 高安全性 |
| SHA-3-256 | 256 位 | 中等 | 强 | SHA-2 备选 |
| BLAKE2b | 512 位 | 极快 | 强 | 性能场景 |
HMAC——基于哈希的消息认证
HMAC(Hash-based Message Authentication Code)使用哈希函数和密钥提供认证:
HMAC(密钥, 消息) = Hash((密钥 ⊕ opad) || Hash((密钥 ⊕ ipad) || 消息))
HMAC-SHA256 广泛用于:
- API 认证(JWT HS256)
- 支付系统中的消息完整性
- TLS 记录认证
使用我们的 HMAC 计算器 计算 HMAC-SHA256/SHA512 值。
哈希函数在支付安全中的应用
在支付系统中,哈希用于:
MAC 算法
MAC(消息认证码)算法使用哈希函数验证消息完整性:
- ISO 9797-1:基于 DES 的 MAC —— 参见 ISO 9797 MAC 工具
- ANSI X9.9/X9.19:零售 MAC —— 参见 ANSI MAC 工具
- AES-CMAC:现代 AES 基础 MAC —— 参见 CMAC 工具
KCV(密钥校验值)
KCV 本质上是密钥的哈希——用密钥加密全零并取前 3 字节。参见 密钥分片与 KCV 指南。
CVV 计算
CVV 使用类似哈希的基于 DES 的过程。参见 CVV 指南。
密码哈希——特殊情况
普通哈希函数不适合存储密码,因为它们太快(攻击者每秒可以尝试数十亿次猜测)。
应使用专用密码哈希函数:
- bcrypt:经过时间检验,广泛支持
- Argon2:密码哈希竞赛获胜者,新系统推荐
- scrypt:内存密集型,良好替代方案
- PBKDF2:NIST 批准,用于许多标准
这些函数故意设计得慢且内存密集,以抵抗暴力破解攻击。
在线工具
使用我们的 哈希计算器 计算:
- MD5、SHA-1、SHA-256、SHA-384、SHA-512
- SHA-3(224/256/384/512)
- BLAKE2b、BLAKE2s、BLAKE3
- SM3、RIPEMD-160
- 支持文本、十六进制或文件输入
所有计算完全在浏览器中运行。