工具箱

MD5 与 SHA-256 的区别:哈希长度、安全性与现实用途

MD5 和 SHA-256 都是密码学哈希函数,把任意长度的输入压缩成固定长度的「指纹」。两者外形相似——都是十六进制字符串、都不可逆——但安全性天差地别:MD5 的碰撞攻击早在 2004 年就被公开攻破,而 SHA-256 至今仍是 TLS 证书和区块链的基石。

对比维度MD5SHA-256
算法家族与输出长度独立设计的 128-bit 哈希,输出 32 个十六进制字符SHA-2 家族成员,输出 256-bit,即 64 个十六进制字符
抗碰撞性已被实际攻破:研究者能低成本构造两个不同文件共享同一 MD5,伪造证书曾真实上演目前没有可行的碰撞攻击,约 2^128 的工作量远超现有算力
运算速度更快。结构简单,在老旧 CPU 上优势明显略慢,但现代 CPU 普遍带 SHA 硬件扩展指令,实际差距已很小
安全用途现状已被主流标准除名:CA/Browser Forum 禁止其用于证书签名,安全场景应视为禁用现代默认选项:TLS 证书签名、区块链工作量证明、HMAC 与软件供应链校验都在用
密码存储适用性绝对不行:计算太快,配合彩虹表几乎秒破同样不推荐直接使用:应选 bcrypt、scrypt 或 Argon2 这类专为密码设计的慢哈希
文件完整性校验仍广泛用于下载校验防「传输损坏」,但无法防御蓄意投毒——攻击者可同时替换文件与 MD5发布签名、容器镜像摘要的标准选择,防损坏也防篡改(配合可信通道分发)
生态兼容性老系统遗留极多:旧数据库口令、历史下载页、部分硬件固件仍在产出 MD5所有现代语言与平台的一等公民,新接口默认提供

何时选 MD5?

只有在维护无法升级的遗留系统、或做非安全性的数据去重/缓存键时才考虑 MD5。它速度快、字符串短,用作内部缓存 key 或去重指纹尚可,但绝不能出现在任何信任边界上。

何时选 SHA-256?

任何新的安全相关需求——文件签名、接口签名、区块链、HMAC——一律选 SHA-256。即便只是给用户展示下载校验值,SHA-256 也是零成本的正确习惯。

相关在线工具

常见问题

MD5 已经被破解,为什么很多下载页还在用它?

因为那些场景只需要检测「传输过程中的意外损坏」,不需要对抗主动攻击者。检查完整性 MD5 够用,防篡改则必须换成 SHA-256 并通过可信渠道分发哈希值。

SHA-256 可以直接用来存用户密码吗?

不建议。SHA-256 计算太快,GPU 每秒可尝试数十亿次。应使用 bcrypt、scrypt 或 Argon2 这类带盐且故意缓慢的算法,把单次验证成本抬高到暴力破解不划算的水平。

MD5 输出只有 32 位字符,会不会更容易撞车?

会。128-bit 空间意味着约 2^64 次计算就有可能找到碰撞,而实际密码分析已把成本压得更低;SHA-256 的 256-bit 空间让这类攻击在可预见的未来都不可行。

延伸说明

迁移存量系统时的常见做法是双写过渡:同一份数据同时记录 MD5 与 SHA-256,新逻辑读 SHA-256,待下游全部切换完成再下线 MD5 列。另外注意区分「碰撞」与「原像」:伪造一份与原文件同 MD5 的替代品在技术上可行但成本仍高,所以 MD5 校验下载是否完整依然有效;只是别让它承担身份认证或签名的职责。站内提供 MD5、SHA 系列在线计算与文件校验工具,本地运行即可比对两种算法的输出差异。

← 返回对比列表