什么是哈希(Hash)?
哈希(Hash),又称散列或摘要,是一种将任意长度的输入数据通过数学算法转换为固定长度的输出字符串的过程。这个输出字符串被称为"哈希值"、"摘要"或"指纹"。
哈希函数具有以下核心特性:
- 确定性:相同的输入始终产生相同的哈希值。
- 快速计算:对任意数据都能快速算出哈希值。
- 单向性:从哈希值几乎不可能反推出原始数据。
- 抗碰撞性:极难找到两个不同输入产生相同的哈希值。
- 雪崩效应:输入微小的变化会导致哈希值完全不同。
哈希算法的常见用途
- 数据完整性校验:文件下载后通过比对 MD5 或 SHA-256 哈希值确认文件未被篡改。
- 密码存储:服务端不存储明文密码,而是存储经过哈希(加盐)后的密码值,如 PBKDF2、bcrypt。
- 数字签名:对消息摘要进行签名,比直接对原始消息签名更高效。
- 区块链:每个区块包含前一区块的哈希值,形成不可篡改的链条。
- Git 版本控制:Git 使用 SHA-1 哈希来标识每次提交(commit)。
- 去重检测:通过比对哈希值快速判断文件是否相同。
普通哈希 vs HMAC vs PBKDF2
| 类型 | 特点 | 典型用途 |
普通哈希 (MD5, SHA-1, SHA-256…) | 无需密钥,直接计算摘要。速度快,但不防篡改。 | 文件校验、数据去重 |
HMAC (HMAC-SHA256, HMAC-SHA512…) | 需要密钥。同时验证数据完整性和身份认证。 | API 签名、JWT Token、消息认证 |
PBKDF2 (Password-Based Key Derivation Function 2) | 需要密码 + 盐值 + 迭代次数。刻意慢速计算以抵御暴力破解。 | 密码哈希存储、加密密钥派生 |
哈希算法一览
- MD5:128位输出,速度快但已被破解,不应用于安全场景,仅适合非安全性的校验。
- SHA-1:160位输出,已被证明存在碰撞漏洞,不推荐用于新系统。
- SHA-256 / SHA-512:SHA-2 家族成员,目前广泛使用的安全哈希算法,推荐用于大多数场景。
- SHA-3:最新 NIST 哈希标准,与 SHA-2 结构完全不同,提供额外安全保障。
- RIPEMD-160:160位输出,常见于比特币地址生成。
- HMAC 系列:将哈希函数与密钥结合,同时验证消息完整性与真实性。
- PBKDF2:通过多轮迭代将密码转换为加密密钥,是存储密码的行业标准之一。
如何选择哈希算法?
- 文件校验:MD5 或 SHA-256(速度与安全兼顾)。
- 密码存储:PBKDF2(搭配足够大的盐值和迭代次数,如 100,000 次以上)。
- API 签名 / JWT:HMAC-SHA256 或 HMAC-SHA512。
- 区块链 / 数字签名:SHA-256 或 SHA3-256。
- 高安全场景:SHA-512 或 SHA3-512。