不喜欢广告? 无广告 今天

MD5,SHA-256,SHA-3 您实际上需要哪种哈希算法?

发布日期

MD5、SHA-1、SHA-256、SHA-3 和 BLAKE3 的直接对比——在何种情况下使用每个算法、它们的局限性,以及默认应选用哪个算法。

MD5、SHA-256、SHA-3:您实际上需要哪种哈希算法?1
广告 移除?

如果您仍然默认使用MD5,您并不孤单——但您可能做出了错误的选择。所有哈希函数都会生成数据的固定长度指纹,但它们并非可以互换。选择错误的算法要么是过度谨慎,要么是真正的安全失败,具体取决于您判断的方向。

以下内容将详细介绍每个算法的实际作用、其缺陷以及您应该选择的替代方案。

哈希函数的作用

密码学哈希函数可以接受任意大小的输入,并返回固定长度的输出——具有确定性、单向性(理想情况下还具有抗碰撞性)。相同的输入始终生成相同的哈希值。无法逆向推导,且输入中哪怕只改变一个字节,输出也会完全改变。

这三种特性使哈希函数在验证数据完整性、签署文档和构建校验和方面非常有用。以下所有算法都具备这些功能。它们之间的区别在于对攻击的抵抗力以及运行速度。

MD5:停止在安全领域使用它

MD5生成128位哈希值,运行速度快——这正是问题所在。它于1991年设计,到2004年研究人员已证明其存在碰撞攻击。如今,生成两个不同文件却拥有相同MD5哈希值在计算上是完全可行的。

其失败场景: 任何安全场景——通过不可信通道进行的文件完整性校验、数字签名、TLS证书。

其仍适用的场景: 非安全校验和。文件去重、生成缓存键、在您控制的系统内对内容进行指纹识别——MD5速度快且足够好。只有当攻击者可以利用碰撞时,才需要担心。

需要快速生成MD5哈希值吗?请使用 MD5生成器.

SHA-1:已弃用,但仍存在

SHA-1生成160位输出,具有同样的根本问题:已存在碰撞攻击。谷歌在2017年的SHAttered攻击中生成了两个不同的PDF文件,其SHA-1哈希值相同,攻击成本如今已对有动机的攻击者而言是可负担的。

它已被正式弃用于数字签名和TLS证书。您仍可能在Git中发现它,作为内容标识符使用——该场景下的威胁模型不同,且Git正在积极向SHA-256迁移。

规则: 不要在新的安全敏感任务中使用SHA-1。在旧系统中将其标记为迁移对象。

SHA-256和SHA-512:当前标准

SHA-256(属于SHA-2家族)是大多数密码学应用的默认选择。输出为256位,目前没有已知的实用攻击,且在几乎所有您可能使用的编程语言和平台上均得到支持。

SHA-512使用512位内部状态并生成512位输出。在64位CPU上,由于其处理块的方式,它通常 更快 处理大输入数据,相较于SHA-256。对于大多数应用层工作,SHA-256已足够。如果您需要高吞吐量数据处理或在密钥派生中需要额外的安全余量,请进行性能测试以评估SHA-512。

使用场景: 文件完整性校验、HMAC、证书签名(使用RSA/ECDSA)、API请求签名、JWT令牌。

SHA-3:不同架构,特定用途

SHA-3(Keccak)于2015年被NIST选定,作为SHA-2的结构替代方案。SHA-2采用Merkle-Damgård构造,而SHA-3采用海绵构造。如果未来在SHA-2设计中发现根本性弱点,SHA-3将不受影响。

它生成相同长度的输出(SHA3-256、SHA3-512等),并通过了当前所有安全分析,但在纯软件环境下通常比SHA-256运行更慢。

使用场景: 在需要与SHA-2架构独立的长期密码系统中——如硬件安全模块、某些政府或合规场景,或任何明确希望防范未来SHA-2弱点的场景。对于大多数网络应用而言,这属于理论上的过度设计。

BLAKE3:现代性能选择

BLAKE3尚未成为NIST标准,但其采用度很高:Rust的 cargo、Bao流式哈希格式,以及越来越多的安全和存储工具均使用它。它专为并行处理设计,在软件中运行速度显著快于SHA-256,同时在当前密码学分析下表现稳定。

使用场景: 高性能校验和、内容寻址、在您完全控制两端且需要速度而不牺牲安全性的场景。避免在SHA-2被明确要求的场景中使用它——如X.509证书、JWT等标准定义场景。

哈希算法对比

Algorithm 安全性状态 输出长度 软件运行速度 使用场景
MD5 已损坏(碰撞) 128位 非常快 非安全校验和、去重
SHA-1 已损坏(碰撞) 160位 仅限遗留系统;Git内容标识符
SHA-256 安全的 256位 通用用途——默认选择
SHA-512 安全的 512位 在64位系统上处理大数据时更快 高吞吐量或需要额外安全余量
SHA-3 安全的 224–512位 在软件中运行较慢 需要与SHA-2架构独立的长期系统
BLAKE3 安全的 256位 非常快(支持并行) 性能关键的内容寻址

计算SHA-256

计算SHA-256哈希的三种快速方法:

Python:

import hashlib

data = b"hello world"
digest = hashlib.sha256(data).hexdigest()
print(digest)
# Output: b94d27b9934d3e08a52e52d7da7dabfac484efe04294e576fba1d63e8d4d0b4b

Node.js:

const { createHash } = require('crypto');

const digest = createHash('sha256')
  .update('hello world')
  .digest('hex');
console.log(digest);

Bash:

echo -n "hello world" | sha256sum

如果需要快速计算哈希值而无需编写代码呢? 哈希生成器 支持MD5、SHA-1、SHA-256、SHA-512等——直接从您的浏览器即可使用。

决策指南

使用场景 应使用什么算法
去重/缓存键 MD5或SHA-256
文件完整性(可信通道) MD5可以接受
文件完整性(下载、不可信来源) SHA-256
数字签名 SHA-256或SHA-512
HMAC和API认证 SHA-256
TLS证书 SHA-256
密码存储 bcrypt、Argon2或scrypt——而不是上述任何一种
高性能内容寻址 BLAKE3
标准合规性 SHA-256(请检查具体要求)

有一点需要明确:这些算法均不应直接用于密码哈希。它们的设计都是快速的,这使其容易受到暴力破解攻击。应使用bcrypt、Argon2id或scrypt——这些算法被设计为故意缓慢且内存密集,正是因为密码破解本质上是敌对行为。

简明答案

对于新代码: 默认使用SHA-256。 如果需要更大的输出长度或在64位硬件上处理大量数据流,请使用SHA-512。在需要高吞吐量且两端均可控制的场景中,请使用BLAKE3。只有在有明确架构原因需要独立于SHA-2时,才使用SHA-3。

MD5适用于内部指纹识别和去重,前提是碰撞不会构成安全问题。它不适用于任何可能让攻击者利用伪造匹配的场景。

如有疑问,请选择SHA-256。它已正确解答了十年问题,未来可预见的时期内仍将如此。

想要享受无广告的体验吗? 立即无广告

安装我们的扩展

将 IO 工具添加到您最喜欢的浏览器,以便即时访问和更快地搜索

添加 Chrome 扩展程序 添加 边缘延伸 添加 Firefox 扩展 添加 Opera 扩展

记分板已到达!

记分板 是一种有趣的跟踪您游戏的方式,所有数据都存储在您的浏览器中。更多功能即将推出!

广告 移除?
广告 移除?
广告 移除?

新闻角 包含技术亮点

参与其中

帮助我们继续提供有价值的免费工具

给我买杯咖啡
广告 移除?