← 返回加密工具箱

哈希算法完全指南:MD5、SHA 与 SM3 的区别

加密工具箱 · 使用教程

哈希(hash,也叫散列、摘要)是每个开发者每天都在用、但很少认真想过的工具。这篇文章讲清它的三个核心性质、主流算法的优劣、以及一个高频错误——用 MD5 存密码。

一、哈希是什么

哈希函数把任意长度的输入,转换成**固定长度的输出**。这个输出叫哈希值、摘要、指纹。

"hello"  →  MD5     →  5d41402abc4b2a76b9719d911017c592
100MB 文件 →  MD5    →  d41d8cd98f00b204e9800998ecf8427e(也是 32 位)
                     ↑ 无论输入多长,输出长度恒定

它有三个关键性质:

1. 单向性

从输入算哈希很容易,从哈希反推输入在计算上不可行。注意是“不可行”而不是“不可能”——理论上你可以暴力枚举所有输入,只是数量级太大,实际做不到。

2. 雪崩效应

输入改动一个比特,输出会面目全非:

MD5("hello")  = 5d41402abc4b2a76b9719d911017c592
MD5("hellp")  = 8b1a9953c4611296a827abf8c47804d7
                 ↑ 只差一个字母,结果完全没有相似性

3. 抗碰撞性

找到两个不同的输入、使它们的哈希值相同,应该极其困难。**这条是安全性的核心,也是 MD5 和 SHA-1 已经失效的原因。**

二、主流算法对比

算法输出长度安全性现状
MD5128 位(32 hex)❌ 已破碰撞可秒级构造,不可用于安全场景
SHA-1160 位(40 hex)❌ 已破2017 年 Google 构造出实际碰撞
SHA-256256 位(64 hex)✅ 安全当前主流选择
SHA-512512 位(128 hex)✅ 安全64 位系统上更快
SM3256 位(64 hex)✅ 安全国密标准,合规场景用

MD5 和 SHA-1 为什么不能用了

不是“理论上存在弱点”,而是**实际碰撞已经被构造出来了**:

这意味着攻击者可以准备一个正常文件和一份恶意文件,两者哈希相同。如果系统靠哈希值判断文件完整性,就完全失效了。

MD5 仍然可以用在非对抗场景——比如你自己算一个文件指纹、确认下载有没有损坏。那里没有攻击者,碰撞不影响。但只要涉及“防止别人作恶”,就不能用。

三、为什么不能用哈希存密码

这是最需要纠正的做法。很多人以为“存 MD5 就安全了,反正不可逆”,实际上:

问题 1:彩虹表

前人已经把常见密码的哈希值算好、做成表了。拿到你的哈希值,查表即可还原:

5f4dcc3b5aa765d61d8327deb882cf99  →  查表  →  "password"

问题 2:GPU 爆破极快

现代显卡每秒能算几十亿次 MD5。8 位以内的纯数字密码,几分钟就能穷举完。

问题 3:相同密码产生相同哈希

没有盐的情况下,两个用户密码相同,哈希也相同。数据库泄露时一眼就能看出“这些人用的是同一个密码”。

正确做法:加盐 + 慢哈希

方案说明
bcrypt自带盐,可调工作因子,最常用
scrypt内存密集,抗 GPU/ASIC
argon2密码哈希竞赛胜出者,当前最优选择

它们的共同点是**故意慢**:一次计算耗时 100ms 左右。正常登录时用户感觉不到,但攻击者想穷举就得把成本乘以几十万倍。

MD5/SHA 是为“快速”设计的,用它们存密码等于放弃了这层防护。

四、怎么用本站工具

  1. 打开加密工具箱的 MD5/SHA 标签页
  2. 输入文本,分别点 MD5 / SHA1 / SHA256 / SHA512
  3. 或者上传文件,浏览器本地计算哈希(大文件也可以,不上传)
  4. SM3 在单独的标签页

五、常见问题

哈希能解密吗?
不能,这是单向性决定的。网上那些“MD5 解密”网站,本质是查表——把常见密码的哈希预先算好。你输入一个罕见的字符串的 MD5,它们也解不出来。
SHA-256 比 MD5 安全多少?
无法用“多少倍”量化,因为它们是质变关系:MD5 的碰撞已被实际构造,SHA-256 的碰撞目前没有任何可行方法。一个是“已经破了”,一个是“目前安全”。
SM3 和 SHA-256 该用哪个?
技术上两者安全强度相当(都是 256 位)。选择依据是合规:金融、政务、等保项目用 SM3;普通互联网业务用 SHA-256 更通用,库支持也更好。
为什么同一个文件在不同工具算出来的哈希不一样?
先确认选的是同一个算法(MD5 vs SHA256 结果长度都不同,一眼能看出)。如果算法相同却不同,检查文件是否被修改过、或者下载是否完整。文本文件还要注意换行符差异(Windows 的 CRLF 和 Linux 的 LF 是不同字节)。
哈希长度固定,会不会信息丢失?
会,而且是必然的。无限多的输入映射到有限的输出空间,一定存在碰撞。设计目标是让碰撞“难以主动构造”,而不是“不存在”。
文件校验该用 MD5 还是 SHA-256?
防下载损坏用 MD5 就够,速度快。但如果这个文件来自不可信来源、或者涉及安全(比如安装包、固件),必须用 SHA-256——因为攻击者可以让恶意文件和人畜无害的文件拥有相同的 MD5。