哈希到底是什么?
哈希(Hash)是把任意长度的输入通过单向函数映射成固定长度输出(摘要)的过程。好的密码学哈希具备:确定性(同输入同输出)、雪崩效应(改 1 个比特输出大变)、抗碰撞(难找到两个不同输入同输出)、单向性(难从输出反推输入)。
但「单向」不等于「不可破解」——对短密码或常见字符串,攻击者可用彩虹表/暴力穷举反查。所以哈希的用途必须选对。
四大用途,四种选法
| 用途 | 推荐 | 原因 |
|---|---|---|
| 文件完整性校验 | MD5 / SHA-256 | 快、可复现,目的是检测传输损坏而非防攻击 |
| 数据指纹 / 去重 | SHA-256 | 碰撞概率极低,输出稳定 |
| 防篡改签名 | SHA-256 / SHA-512 | 配合密钥(HMAC)验证内容未被改 |
| 密码存储 | BCrypt / Argon2 | 慢哈希 + 盐,专为抵抗暴力破解设计 |
MD5 / SHA-1:已不安全但仍有用武之地
MD5(128 位)和 SHA-1(160 位)已被证明存在实际碰撞攻击,绝不能用于安全标识、数字签名、证书。但在「文件去重」「缓存键」「非安全校验和」这类不防敌手的场景,它们依然快且可用。
经验法则:如果攻击者有可能精心构造输入来骗你,就别用 MD5/SHA-1。否则(如本地文件比对)可以用。
SHA-2 家族:当前默认安全选择
SHA-256 / SHA-384 / SHA-512 同属 SHA-2,目前无已知实用碰撞攻击,是绝大多数安全场景的默认选择:
- SHA-256:输出 256 位,最通用,区块链、证书、Git 提交、文件签名都用它。
- SHA-512:输出 512 位,在 64 位 CPU 上更快,抗长度扩展攻击表现更好。
为什么密码不能用 SHA?
SHA 的设计目标是快——这是它的优点,却是密码存储的致命缺点。攻击者用一张 GPU 每秒可算数十亿次 SHA,弱密码瞬间被破。
密码存储需要慢哈希(slow hash)+ 盐(salt):
- BCrypt:自适应成本因子,可随硬件变强而调慢;自动加盐。
- Argon2:2015 年密码哈希竞赛冠军,内存硬(抵抗 GPU/ASIC)。
- SCrypt:内存硬,同样抗硬件加速。
本站 hash-text 是通用单向哈希工具,适合校验/指纹/签名验真;密码存储请用专门的 BcryptHash 类方案,不要在这里「哈希一下密码就存库」。
哈希 ≠ 加密
- 加密(AES 等):可逆,有密钥能还原明文 → 用于保护机密。
- 哈希(SHA/MD5/BCrypt):单向,不可还原 → 用于验证完整性 / 生成指纹。
需要把数据还原出来?用加密,不是哈希。
最佳实践
- 校验/指纹用 SHA-256,别为"更快"退回 MD5 做安全用途。
- 防篡改用 HMAC-SHA256,把密钥一起参与哈希。
- 密码存储用 BCrypt/Argon2,绝不用裸 SHA。
- 别把哈希当加密:需要还原就上 AES。
- 可复现场景不加随机盐(如文件校验),密码场景必须加盐。