转换器

密码学哈希函数详解:MD5 vs SHA-256 vs SHA-512

学习密码学哈希函数的工作原理,从 MD5 到 SHA-256 和 SHA-512。涵盖雪崩效应、碰撞攻击、使用 bcrypt/Argon2 进行密码哈希、HMAC 认证,以及在区块链、TLS 和 Git 中的实际应用。

发布于 2026年3月25日
16 分钟阅读
密码学指南

密码学哈希函数接受任意输入——单个字符、10 GB 的文件、空字符串——并产生固定长度的输出,称为哈希值(也叫消息摘要、校验和或指纹)。相同的输入始终产生相同的哈希值,但即使输入中仅改变一个比特,输出也会完全不同。这种单向特性使哈希函数成为现代计算机安全的基石,从密码存储和数字签名,到区块链和文件完整性验证,无处不在。

如果你现在需要生成哈希值,可以使用我们的免费在线哈希生成工具——它完全在浏览器中为文本和文件计算 MD5、SHA-1、SHA-256、SHA-384 和 SHA-512 哈希值。

什么是密码学哈希函数?

哈希函数是一种数学算法,将任意大小的数据映射到固定大小的输出。密码学哈希函数是满足额外安全要求、适用于安全协议的哈希函数。

这一概念可以追溯到 20 世纪 50 年代,当时 IBM 的 Hans Peter Luhn 创造了用于错误检测的 Luhn 算法。现代密码学哈希函数在 20 世纪 90 年代兴起:罗纳德·李维斯特(Ronald Rivest)先后提出了 MD4(1990 年)和 MD5(1991 年),随后 NSA 发布了 SHA-0(1993 年)和 SHA-1(1995 年),最终推出了包含 SHA-256 和 SHA-512 的 SHA-2 系列(2001 年)。

安全哈希函数的五个属性

每个密码学哈希函数都必须满足五个基本属性:

1. 确定性

相同的输入始终产生相同的输出。无论今天、明天,还是在世界上任何一台计算机上,用 SHA-256 对"hello"进行哈希,都会得到 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824。这一属性使哈希函数能够用于校验。

2. 计算高效

计算任意输入的哈希值应当高效。SHA-256 在现代硬件上每秒可处理数百兆字节的数据。这种速度对于 TLS(每个数据包都需要认证)和区块链挖矿(每秒计算数十亿次哈希)等应用至关重要。

3. 原像抗性(单向性)

给定哈希输出,从计算上找到能产生该哈希值的任何输入应当是不可行的。这就是哈希"单向性"的含义。如果攻击者获得了类似 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 的密码哈希,他们无法反推出原始密码"password"(尽管他们可以尝试猜测常见密码——这也是我们使用加盐(salt)和专用密码哈希函数的原因)。

4. 抗碰撞性

从计算上找到两个产生相同哈希输出的不同输入应当是不可行的。由于哈希函数将无限的输入空间映射到有限的输出空间,碰撞在数学上必然存在(这是鸽巢原理)。安全保证在于:找到一个碰撞所需的时间,应当超过该算法的预期使用寿命。

对于具有 256 位输出的 SHA-256,通过暴力破解找到碰撞大约需要 2^128 次操作(生日攻击上界)——操作次数比可观测宇宙中的原子数量还多。

5. 雪崩效应

输入的微小改变应当导致哈希值发生剧烈变化。这有时被称为"雪崩效应"或"扩散性"。以下是 SHA-256 的一个具体示例:

输入SHA-256 哈希值
hello2cf24dba5fb0a30e26e83b2ac5b9e29e...
Hello185f8db32271fe25f561a6fc938b2e26...
hello!ce06092fb948d9ffac7d1a376e404b26...

仅改变一个字符(小写'h'变为大写'H'),哈希输出的每个字符都随之改变。既无法预测哈希值会如何变化,也无法从哈希值反推出输入。

哈希函数的内部工作原理

虽然完整的内部机制较为复杂,但大多数哈希算法遵循一种通用的基本流程:

第一步:填充。 将输入填充到算法块大小的整数倍(MD5/SHA-1/SHA-256 为 512 位,SHA-512 为 1024 位)。填充内容包含原始消息的长度。

第二步:初始化。 用固定常量("初始哈希值")初始化内部状态。对于 SHA-256,这些常量来源于前 8 个质数平方根的小数部分。

第三步:压缩。 将填充后输入的每个块通过压缩函数处理,更新内部状态。该函数通常涉及位运算(AND、OR、XOR、旋转)、模加法和消息调度。SHA-256 每块执行 64 轮压缩;SHA-512 每块执行 80 轮。

第四步:最终化。 处理完所有块后,将最终的内部状态输出为哈希值。

算法的安全性取决于压缩函数能否以复杂、非线性的方式使输出的每个比特都依赖于输入的每个比特。

MD5:历史、漏洞与现状

MD5(消息摘要算法 5)由罗纳德·李维斯特(Ronald Rivest)于 1991 年设计,是 MD4 的继任者。它产生 128 位(32 个十六进制字符)的哈希值,在整个 20 世纪 90 年代至 21 世纪初是主流哈希算法。

MD5 的衰落

  • 1996 年:Hans Dobbertin 发现了 MD5 压缩函数中的碰撞,引发了初步的安全关切。
  • 2004 年:王小云等人展示了首个实用碰撞攻击,在约一小时内找到两个具有相同 MD5 哈希值的不同输入。
  • 2006 年:Vlastimil Klima 发表了一种在笔记本电脑上一分钟内找到 MD5 碰撞的方法。
  • 2008 年:Alexander Sotirov 等人利用 MD5 碰撞伪造了一个流氓证书颁发机构证书,使 HTTPS 中间人攻击成为可能。这是 MD5 在实践中已经危险的决定性证明。
  • 2012 年:Flame 恶意软件(归因于国家级行为者)利用 MD5 碰撞伪造了 Windows Update 证书。

今天,对 MD5 的碰撞攻击可以在消费级硬件上在数秒内完成。

MD5 仍可接受的场景

尽管在密码学上已被攻破,MD5 仍用于非安全目的:

  • 非恶意文件校验:验证文件下载在传输过程中未损坏(而非被篡改)
  • 数据去重:在存储系统中识别重复文件
  • 缓存键:为缓存数据生成简短的唯一标识符
  • 哈希表分布:将键分散到哈希表的各个桶中
  • 遗留系统兼容:与仅支持 MD5 的旧系统互操作

关键区别在于:如果攻击者可能从制造碰撞中获益,就不要使用 MD5。如果你只需要对非对抗性的完整性检查进行快速校验,MD5 没有问题。

SHA-1:已废弃的中间地带

SHA-1(安全哈希算法 1)由 NSA 于 1995 年发布,产生 160 位(40 个十六进制字符)的哈希值。它是使用最广泛的哈希函数超过十年,为 SSL/TLS 证书、Git 提交和代码签名提供支撑。

SHA-1 的终结

  • 2005 年:理论碰撞攻击表明 SHA-1 比预期更脆弱。
  • 2017 年:谷歌和荷兰数学与计算机科学研究中心(CWI Amsterdam)展示了首个实用的 SHA-1 碰撞("SHAttered"),找到两个具有相同 SHA-1 哈希值的不同 PDF 文件。该攻击需要 6500 年的 CPU 算力和 110 年的 GPU 算力——代价高昂,但对资金充裕的攻击者而言可行。
  • 2020 年:一种选择前缀碰撞攻击将成本降至约 45,000 美元,使小型组织也可负担。

当今的 SHA-1

  • 所有主流浏览器已废弃 SHA-1 用于 TLS 证书(自 2017 年起)
  • Git 仍对提交哈希使用 SHA-1,但正在积极向 SHA-256 迁移(git hash object format v2)
  • 不应用于任何新的安全应用

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

SHA-256 和 SHA-512 是 SHA-2 系列的组成部分,由 NSA 于 2001 年发布,是当前推荐的密码学哈希标准。

SHA-256

  • 输出:256 位(64 个十六进制字符)
  • 块大小:512 位(以 32 位字运算)
  • 轮数:64 轮压缩
  • 安全性:无已知的实用或理论攻击。找到碰撞大约需要 2^128 次操作。
  • 应用场景:TLS 1.2/1.3 证书、比特币(双重 SHA-256)、API 认证中的 HMAC(AWS、Stripe)、Docker 内容寻址、文件完整性验证

SHA-512

  • 输出:512 位(128 个十六进制字符)
  • 块大小:1024 位(以 64 位字运算)
  • 轮数:80 轮压缩
  • 安全性:比 SHA-256 更强,抗碰撞强度约为 2^256 次操作
  • 性能:颇为反直觉的是,在 64 位处理器上,SHA-512 往往比 SHA-256 更快,因为其算法天然使用 64 位操作,可直接映射到现代 CPU 指令
  • 应用场景:证书颁发机构、政府/军事应用、SSH 密钥、部分加密货币实现

SHA-384

SHA-384 是 SHA-512 的截断版本——它使用相同的算法,但采用不同的初始值,仅输出 384 位。它在 SHA-256 和 SHA-512 的安全级别之间提供了一个折中方案。

MD5 vs SHA-256 vs SHA-512:完整对比

属性MD5SHA-256SHA-512
输出大小128 位(32 个十六进制字符)256 位(64 个十六进制字符)512 位(128 个十六进制字符)
块大小512 位512 位1024 位
字大小32 位32 位64 位
轮数646480
安全状态已攻破(2004 年)安全安全
抗碰撞性无(数秒内可破)约 2^128 次操作约 2^256 次操作
速度(软件)约 650 MB/s约 250 MB/s约 350 MB/s*
速度(硬件/ASIC)极快快(比特币 ASIC)中等
适用于安全目的
适用于密码否(太快)否(太快)

*在 64 位 CPU 上,SHA-512 因原生 64 位字运算而比 SHA-256 更快。

结论:通用安全场景(文件完整性、数字签名、HMAC)使用 SHA-256;当需要最高安全性或在 SHA-512 实际更快的 64 位系统上运行时使用 SHA-512;安全场景中绝不使用 MD5。

哈希与加密:有何区别?

这是密码学中最常见的混淆之一:

哈希加密
方向单向(不可逆)双向(可用密钥解密)
目的验证完整性和真实性保护机密性
需要密钥?否(HMAC 除外)是(对称或非对称)
输出大小固定(如始终为 256 位)可变(与输入成比例)
相同输入 → 相同输出?始终否(使用正确的 IV/nonce 时)
示例SHA-256、MD5、bcryptAES、RSA、ChaCha20

哈希用于需要验证数据未被篡改(文件校验、密码验证、数字签名),但不需要恢复原始数据的场景。

加密用于需要保护数据、使只有授权方能读取的场景(HTTPS、磁盘加密、即时通讯)。

两者经常配合使用:TLS 使用加密(AES)保护传输中的数据,同时使用哈希(HMAC-SHA-256)验证数据完整性。

密码哈希:为何 SHA-256 还不够

SHA-256 是一种安全的哈希函数,但它不适合用于密码哈希。原因反直觉:SHA-256 速度太快了。配备 GPU 的攻击者每秒可计算数十亿次 SHA-256 哈希,在几秒内就能尝试所有常见密码。

专用密码哈希函数

现代密码哈希使用专为刻意降速而设计的特殊算法:

算法年份关键特性抗性
bcrypt1999可调节成本因子,基于 Blowfish抗 CPU 暴力破解
scrypt2009内存密集型(需要大量 RAM)抗 CPU + 抗内存暴力破解
Argon22015密码哈希竞赛冠军抗 CPU + 抗内存 + 抗并行暴力破解

Argon2(具体为 Argon2id)是当前新系统的推荐标准,具有三个可配置参数:

  • 时间成本:迭代次数(越多越慢)
  • 内存成本:所需 RAM 量(越多越难在 GPU 上并行)
  • 并行度:线程数量

加盐

所有密码哈希函数都使用加盐——在哈希之前为每个密码添加唯一的随机值。这意味着:

  • 密码相同的两个用户会得到不同的哈希值
  • 预计算的彩虹表毫无用武之地
  • 攻击者必须逐一破解每个密码

盐值与哈希值一起存储(无需保密,只需唯一即可)。

HMAC:基于哈希的消息认证

HMAC(基于哈希的消息认证码)将哈希函数与密钥结合,创建认证码。HMAC 结构定义于 RFC 2104:

HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))

其中 H 是哈希函数,K 是密钥(填充至块大小),ipad 是重复的 0x36,opad 是重复的 0x5c。

为何不直接对密钥+消息进行哈希?

类似 H(key || message) 的朴素方式容易受到长度扩展攻击——知道 H(key || message) 的攻击者可以在不知道密钥的情况下计算 H(key || message || attacker_data)。HMAC 的嵌套结构防止了这一点。

HMAC 的实际应用

  • HMAC-SHA256(HS256):JWT 令牌签名最常用的算法
  • AWS Signature V4:使用 HMAC-SHA256 进行 API 请求认证
  • Stripe Webhook:使用 HMAC-SHA256 签名以供验证
  • TLS 1.3:在 HKDF 密钥派生函数中使用 HMAC
  • OAuth 1.0:使用 HMAC-SHA1 进行请求签名

你可以使用我们的哈希生成工具的 HMAC 选项卡生成 HMAC 值——支持 HMAC-MD5、HMAC-SHA1、HMAC-SHA256、HMAC-SHA384 和 HMAC-SHA512。

哈希函数的实际应用

区块链与加密货币

比特币的工作量证明系统建立在 SHA-256 之上。每个区块头使用双重 SHA-256(SHA256(SHA256(header)))进行哈希,矿工竞相找到哈希值以特定数量零开头的输入。以太坊使用 Keccak-256(SHA-3 的一个变体)。区块链的整个安全模型——不可篡改的账本、交易验证——都依赖于抗碰撞性。

TLS/SSL 证书

当你访问 HTTPS 网站时,服务器证书使用哈希函数(通常是 SHA-256)进行签名。你的浏览器通过计算哈希值并与签名对比来验证证书。从根 CA 到网站的整个证书链都依赖于哈希的抗碰撞性。

Git 版本控制

Git 通过 SHA-1 哈希值来标识每个对象(提交、树、数据对象)。当你运行 git commit 时,Git 会计算提交对象的 SHA-1 哈希值,该值即成为提交 ID。Git 正在积极向 SHA-256 迁移以提升安全性,但基于 SHA-1 的系统已可靠运行近二十年。

数字签名

数字签名的工作方式是:用 SHA-256 对文档进行哈希,然后用签名者的私钥加密哈希值。接收方用签名者的公钥解密签名,并与自己计算的文档哈希值进行比较。若匹配,则证明文档真实且未被篡改。

内容可寻址存储

Docker、IPFS 和包管理器(npm、pip)等系统使用 SHA-256 哈希值作为内容地址。Docker 镜像层通过其内容的 SHA-256 哈希值来标识,确保相同内容始终解析到相同标识符,且无法被篡改。

子资源完整性(SRI)

Web 浏览器可以使用 SRI 哈希验证 CDN 托管的 JavaScript 和 CSS 文件未被篡改。integrity 属性包含预期文件内容的 Base64 编码 SHA-384 哈希值:

<script src="https://cdn.example.com/lib.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8w"
  crossorigin="anonymous"></script>

未来展望:SHA-3 及其后继者

SHA-3(Keccak)于 2015 年由 NIST 标准化,作为 SHA-2 被攻破时的备选方案。它使用与 SHA-2 的 Merkle-Damgård 结构完全不同的内部结构("海绵结构")。虽然 SHA-2 仍然安全且被广泛使用,SHA-3 提供了纵深防御。

BLAKE3 于 2020 年发布,是一种更新的哈希函数,在保持强安全性的同时比 SHA-256 快得多(通常快 5–10 倍)。它在哈希速度至关重要的应用场景中正获得越来越多的采用,例如文件完整性检查和去重。

常见问题

哈希和加密有什么区别?

哈希是单向的——无法从哈希值恢复原始输入。加密是双向的——可以用正确的密钥将密文解密回明文。哈希用于验证完整性;加密用于保护机密性。两者服务于不同目的,经常在 TLS 等安全协议中配合使用。

哈希值能被反转或"解密"吗?

不能。哈希值无法被反转,因为哈希过程中信息会丢失(输入空间无限,但输出空间固定)。然而,攻击者可以通过猜测(暴力破解)或使用预计算表(彩虹表)来尝试找到输入。这就是为什么密码应使用加盐的慢速哈希函数(如 bcrypt 或 Argon2)。

SHA-256 能抵抗量子计算攻击吗?

在一定程度上可以。量子计算机上的 Grover 算法可以将寻找原像的暴力搜索从 2^256 次操作降至 2^128 次操作,但这仍然是不可行的。对于碰撞查找,影响相对较小。当前的共识是,SHA-256 对量子攻击提供约 128 位的安全性,这在可预见的未来被认为是足够的。

为什么比特币使用双重 SHA-256 而不是单次 SHA-256?

比特币使用 SHA256(SHA256(x)) 是为了防御长度扩展攻击,并增加安全余量。2008 年中本聪设计比特币时,对单次 SHA-256 可能存在的潜在弱点(类似 MD5 和 SHA-1 发生的情况)有所顾虑,这促使采用了双重哈希方案。实际上,单次 SHA-256 仍然安全,因此双重哈希是一种保守的设计选择。

目前最快且仍然安全的哈希函数是哪个?

BLAKE3 目前是最快的通用密码学哈希函数,通过利用并行性和 SIMD 指令,通常能达到 SHA-256 吞吐量的 5–10 倍。在标准化算法中,SHA-512 在 64 位系统上比 SHA-256 更快。对于非密码学速度场景(不需要安全性时),xxHash 和 MurmurHash 要快几个数量级。

通过暴力破解一个 SHA-256 哈希需要多长时间?

对于随机的 256 位输入,找到一个原像大约需要 2^256 次操作——约 1.16 × 10^77 次猜测。即使可观测宇宙中的每个原子(约 10^80 个)都是一台以 10^18 次哈希/秒速度运行的计算机,也需要大约 3.7 × 10^41 年。SHA-256 原像在实践中找到是不可能的。

小结

密码学哈希函数是现代安全体系最基础的构建模块之一。理解 MD5(已攻破)、SHA-1(已废弃)和 SHA-256/SHA-512(当前标准)之间的区别,有助于在应用中做出明智的选择。记住:通用安全使用 SHA-256,密码使用 bcrypt/Argon2,认证使用 HMAC,安全场景中绝不使用 MD5。

试用我们的免费在线哈希生成工具,为文本和文件计算 MD5、SHA-1、SHA-256、SHA-384、SHA-512 哈希值和 HMAC 码——所有计算均在你的浏览器中完成。

关于本文

本文是我们综合 转换器 教程系列的一部分。继续了解古典密码学,并探索我们的交互式密码工具。

更多 转换器 教程

试用 转换器 工具

通过我们的交互式转换器工具,将所学知识付诸实践。

试用 转换器 工具