MD5 与 SHA-256:区别,安全性和使用时机
比较MD5,SHA-1,SHA-256和SHA-3:哈希函数是如何工作的,为什么MD5被破坏,速度,检查总和,HMAC以及哈希密码的正确方法。
· 7 分钟阅读
哈希函数是软件中使用最广泛的构建块之一。它们验证下载,删除复制文件,签署API请求,支持Git和区块链,并保护存储的密码。开发人员最常遇到的两个名称是MD5和SHA-256,。简单的答案是:对于任何涉及安全的东西,。长的答案解释了为什么,
密码哈希函数的作用
一个哈希函数可以输入任何长度的输入,并产生一个称为消化的固定长度输出。MD5 产生 128 位 (32 个六进制字符);SHA-256 产生 256 位 (64 个六进制字符)。
MD5("hello world") = 5eb63bbbe01eeed093cb22bb8f5acdc3
SHA-256("hello world") = b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
一个好的密码哈希具有三个安全性质:
- 前图像阻力: 鉴于消化,不可能找到任何产生它的输入。
- 第二次预影阻力: 鉴于输入,无法在相同的摘要中找到不同的输入。
- 碰撞阻力: 找不到任何两种不同的输入与相同的消化。
它还应该显示雪崩效应:改变一个单个的输入位改变了大约一半的输出位,所以类似的输入具有完全不相关的消化。试试在一个哈希生成器中:"你好,世界"和"你好,世界!"
MD5 的简短历史
罗恩·里维斯特在1991年设计了MD5。它是快速的,并且变得无处不在:文件检查总和,密码存储,数字证书。2004年研究人员证明了实际的碰撞。到2008年,一个团队通过利用MD5碰撞创建了一个流证书授权证书,而2012年,Flame恶意软件使用MD5碰撞伪造微软代码签名证书。如今,在笔记本电脑上生成MD5碰撞需要几秒钟。
对于MD5的预图像攻击仍然是理论性的,但碰撞阻力完全破损,这足以排除攻击者可能参与的签名,证书和完整性检查。
SHA-1:也已退休
通过SHA-1进行了类似的测试。2005年发表了理论上的弱点,而在2017年,谷歌和阿姆斯特丹CWI产生了第一个真正的碰撞 ("SHAttered"):两个具有相同SHA-1哈希的不同PDF文件。浏览器停止接受SHA-1证书,Git正在迁移到SHA-256。处理SHA-1就像MD5一样。
SHA-256 和 SHA-2 系列
2001年由NIST出版的SHA-2,包括SHA-224,SHA-256,SHA-384和SHA-512。SHA-256是最广泛使用的:TLS证书,代码签名,比特币,包管理器,子资源完整性,JWT签名 (HS256和RS256) 和更多。经过20多年的分析,
SHA-512使用64位操作,并且在没有硬件加速的64位CPU上通常比SHA-256快。SHA-384是一个缩短的SHA-512,它也能够抵御长度扩展攻击。
其他
2015年标准化的SHA-3 (Keccak) 使用了完全不同的内部设计海绵结构,因此对SHA-2的突破不会自动影响它。它不是SHA-2的替代品,而是具有不同的特性的备份。在规范要求使用时使用它;否则SHA-256仍然是实用默认。
一对一的比较
| 算法 | 输出大小 | 碰撞阻力 | 情况 |
|---|---|---|---|
| 其他 | 128位 | 破碎 (秒) | 不是为了安全。 |
| 其他数据 | 160位 | 破碎 (2017) | 不是为了安全。 |
| 其他类型 | 256位 | 在安全状态下 | 建议默认 |
| 它们的位置: | 512位 | 在安全状态下 | 建议 |
| 它们的位置是: | 256 / 512位 | 在安全状态下 | 建议的替代方案 |
| 黑色3 | 256位 (可扩展) | 在安全状态下 | 非常快速,增长的采用 |
速度
在纯软件中,MD5比SHA-256快,。现代x86和ARM处理器包括SHA-256硬件指令,使SHA-256以每秒千兆字节运行。在实践中,从磁盘或网络读取文件通常是瓶,而不是哈希。如果原始速度对于非安全用途至关重要,BLAKE3或非加密哈希如xxHash可以击败两者。
当MD5仍然是可以接受的
只有当有人能故意制造输入时,。它仍然可以接受:
- 在没有攻击者参与的情况下检测转移或存储中的意外腐败。
- 缓存密钥和可信数据的重复,例如把自己的文件放在桶中。
- 遗留兼容性,例如只发布MD5检查总和的系统或需要它的协议。
即使在这些情况下,选择SHA-256成本也很低,。许多事件始于一个"只用于腐败"的检查总和,
正确检查下载
当一个项目发布SHA-256检查总和时,计算下载的哈希值,并比较每个字符:
sha256sum ubuntu.iso # Linux
shasum -a 256 ubuntu.iso # macOS
Get-FileHash ubuntu.iso # Windows PowerShell
匹配的检查总和证明文件与出版商的哈希结果相匹配。它并不能证明发行者是合法的:如果攻击者控制了网站,他们可以替换文件和检查总和。签名的检查总数 (GPG或Sigstore) 填补了这一差距。
HMAC:使用密钥进行哈希
简单的哈希证明了完整性,但不是真实性。HMAC将密钥与消息结合起来,因此只有拥有密钥的方才能生成或验证结果。基于Stripe,GitHub和Slack的Webhook使用HMAC-SHA256签名,而JWT使用HS256签名 (http://blog/how-jwt-works) 则使用HMAC-SHA256签名。
不要通过连接secret + message并对其进行哈希来构建自己的密钥哈希。在MD5,SHA-1和SHA-256中,它容易受到长度扩展攻击。使用每个语言提供的标准HMAC结构。在比较签名时,使用常量时间比较函数以避免时间攻击。
密码需要一个完全不同的工具
不应直接使用MD5或SHA-256来存储密码。快速散列是缺点:现代GPU每秒计算出数十亿个SHA-256散列,。没有盐的哈希更糟,因为预先计算的表可以立即破解常见的密码。
使用密码哈希函数,设计为缓慢且难以存储:
- 是密码哈希竞赛的获胜者,也是当前的首选。
- 硬记忆和广泛可用。
- bcrypt 较老,但仍然可以接受,输入限制为72字节。
- PBKDF2具有高代数,当合规性需要NIST批准的原始。
这些功能增加了每个密码的独特盐和可配置的成本因素,。图书馆处理细节:你打电话给hash(password)和verify(password, stored)。
编码摘要
摘要是原始字节,通常显示为十六进制 (每字节两个字符) 或Base64 (更紧)。同样的SHA-256摘要是64个六进制字符或44个Base64字符。副资源完整性属性使用Base64 (sha384-...),而检查总和文件使用hex。更多关于编码方面的信息,请参阅[Base64解释] (http://blog/base64-explained)。
决策指南
- 完整性检查,签名,证书,任何与安全相关的东西: SHA-256 (或SHA-512,SHA-3,BLAKE3)。
- 使用共享密码验证消息: HMAC-SHA256。
- 存储密码: Argon2id,scrypt 或 bcrypt 永远不是一个简单的哈希。
- 非对抗性检查总和或缓存密钥: MD5 有效,但SHA-256是更安全的习惯。
- 非常高速的非安全散列 (散列表,碎片): xx散列或类似的非加密散列。
总结
MD5 和 SHA-1 是为了抗碰撞而破解的,并且不能在攻击者可以从制作输入中获益的情况下使用。SHA-256是安全的,快速的硬件支持和完整性和签名的正确默认。使用HMAC进行密钥身份验证,以及用于密码的Argon2id等专用缓慢函数。如果怀疑,选择SHA-256 它永远不是完整性的错误答案,而MD5越来越多。
本页内容由英文自动翻译而来,如发现错误,欢迎告诉我们。