下载安装包时官网让你核对一串 64 位的字符,数据库设计时纠结密码字段存什么——都绕不开同一个东西:哈希(Hash)。它不是加密,而是把任意长度的内容压成一份固定长度的"指纹":输入变一个字,指纹就面目全非;但从指纹推不回原文。本文讲清 MD5/SHA 家族的用法、误区,以及"MD5 解密"广告背后的真相。
哈希函数的三个关键性质
- 单向:从原文算指纹极快(毫秒级),从指纹反推原文在数学上不可行;
- 定长:1 个字和 1GB 文件的 MD5 都是 32 位十六进制,SHA-256 都是 64 位;
- 雪崩效应:原文只改一个字,整个指纹完全不同——所以能发现任何细微改动。
MD5、SHA-1、SHA-256,怎么选?
| 算法 | 长度 | 安全性现状 | 还能用在哪 |
|---|---|---|---|
| MD5 | 128 位(32 个十六进制字符) | 2004 年起可人为构造碰撞,已不安全 | 缓存键、去重指纹等非对抗场景 |
| SHA-1 | 160 位 | 2017 年已实现实际碰撞攻击,浏览器陆续停用其证书 | 同上,逐步淘汰 |
| SHA-256 | 256 位 | 目前无实用攻击,推荐 | 文件校验、签名、区块链等 |
规则很简单:防"传输出错"用谁都行,防"人为篡改"至少 SHA-256,存密码则一个都不能用(见下文)。
"MD5 解密"是什么?网站声称能解密靠谱吗?
MD5 在数学上不可逆,不存在真正的解密。所谓"MD5 解密网站",原理是预先收录海量"常见原文 → MD5"的对照表(彩虹表),你输入哈希值它去查表——查得到说明原文是 123456、admin 这类弱口令,查不到就束手无策。所以:反查能力强弱,恰恰反映了原文弱不弱。
为什么存密码绝对不能用 MD5?
三个原因叠加:MD5 计算太快,现代显卡每秒可尝试数十亿次;不加盐时相同密码哈希相同,攻破一个等于攻破一片;就算加盐,快的算法也扛不住持续撞库。业界标准是 bcrypt / scrypt / argon2 这类"故意慢、且自动加盐"的密码哈希算法——慢,正是为了安全。
实用场景:验证下载的文件没被篡改
- 官网下载页面找到官方公布的 SHA-256 校验值;
- 本地计算下载文件的哈希(Windows:
certutil -hashfile 文件名 SHA256;macOS/Linux:shasum -a 256 文件名); - 与官方值逐字符比对,一致才安装。校验值一致 ≠ 官方软件无后门,但能保证"你拿到的就是官方发布的那个文件"。
顺带分清一对常被混淆的概念:Base64 是编码不是加密,转换是可逆的、没有密钥;而哈希是单向指纹。需要"可逆地变换格式"用 Base64,需要"验证没被改过"才用哈希。