科普

SHA-384 哈希算法详解:原理、用途、安全性与实践建议

系统介绍 SHA-384 哈希算法的输出格式、工作原理、典型用途、安全强度、与 SHA-256 和 SHA-512 的区别,以及在真实项目中的使用建议。

SHA-384(Secure Hash Algorithm 384-bit)是 SHA-2 家族中的一种密码学哈希函数。它可以把任意长度的输入数据转换为固定长度的 384 位摘要,通常以 96 个十六进制字符显示。与更常见的 SHA-256 相比,SHA-384 的输出更长,抗碰撞安全边际更高;与 SHA-512 相比,它保留了 64 位内部运算结构,但输出被截断为 384 位,适合需要更高摘要强度但不一定需要完整 512 位输出的场景。

如果你想快速生成 SHA-384、SHA-256、SHA-512 或其他 SHA 系列哈希值,可以使用我们的 SHA 哈希生成器

需要先明确一点:SHA-384 是哈希算法,不是加密算法。它没有密钥,不能被“解密”,也不应该单独用于密码存储。它更适合用于完整性校验、数字签名输入、数据指纹、内容寻址和安全协议中的摘要计算。

1. 什么是 SHA-384?

SHA-384 属于 SHA-2 系列,由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布在 FIPS 180 系列标准中。SHA-2 家族包括 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 和 SHA-512/256 等变体。

从结构上看,SHA-384 与 SHA-512 更接近,而不是与 SHA-256 更接近。它使用 1024 位消息分组、64 位工作字和 80 轮压缩运算,最后输出内部状态中的前 384 位。

项目SHA-384 参数
输出长度384 位
十六进制长度96 个字符
分组大小1024 位
内部工作字长64 位
压缩轮数80 轮
所属系列SHA-2

示例:

输入: "Hello World"
SHA-384: "99514329186b2f6ae4a1329e7ee6c610a729636335174ac6b740f9028396fcc803d0e93863a7c3d90f86beee782f4f3f"

输入: "Hello World!"
SHA-384: "bfd76c0ebbd006fee583410547c1887b0292be76d582d96c242d2a792723e3fd6fd061f9d5cfd13b8f961358e6adba4a"

只改变一个感叹号,输出就完全不同。这种输入微小变化导致摘要剧烈变化的现象,称为雪崩效应

2. SHA-384 的核心特性

一个适合安全场景的密码学哈希函数,通常需要具备以下特性:

  • 确定性:相同输入永远得到相同输出
  • 定长输出:无论输入是一句话还是一个大文件,输出长度都固定
  • 高效计算:可以快速处理文本、二进制文件和数据流
  • 单向性:给定哈希值,很难反推出原始输入
  • 抗第二原像攻击:给定一个输入,很难找到另一个不同输入产生相同哈希
  • 抗碰撞性:很难找到任意两个不同输入产生相同哈希

对于理想的 384 位哈希函数,通用碰撞攻击复杂度约为 2^192,原像攻击复杂度约为 2^384。这使 SHA-384 在需要较高安全余量的签名、证书、长期校验和高价值数据完整性场景中很有吸引力。

3. SHA-384 的工作原理

SHA-384 的整体流程可以概括为:消息填充、分组处理、消息扩展、压缩运算和输出截断。它基于 Merkle-Damgard 结构,每个数据分组都会更新内部哈希状态,最终生成固定长度摘要。

3.1 消息填充

SHA-384 先对输入消息进行填充,使其长度适合 1024 位分组处理:

  1. 在原始消息末尾追加一个 1
  2. 继续追加若干个 0
  3. 让填充后的长度满足 896 mod 1024
  4. 最后追加 128 位长度字段,记录原始消息的位长度

填充完成后,消息总长度会成为 1024 位的整数倍。即使输入为空字符串,也会经历同样的填充流程。

3.2 初始化哈希状态

SHA-384 使用 8 个 64 位初始哈希值。这些初始值与 SHA-512 不同,因此即使它们的内部结构相似,同一输入的 SHA-384 摘要也不是简单截取 SHA-512 结果得到的。

3.3 消息扩展与压缩

每个 1024 位分组会先被拆分成 16 个 64 位字,然后扩展为 80 个 64 位消息字。扩展过程会使用循环右移、右移、异或和模加运算,让原始分组中的每一部分在后续压缩中反复参与计算。

压缩阶段使用 8 个工作变量和 80 个轮常量。每一轮都会混合当前状态、消息字和轮常量,经过多轮扩散后,输入中的微小变化会迅速影响最终摘要的大量位。

3.4 输出 384 位摘要

SHA-384 完成所有分组处理后,不输出完整的 512 位内部状态,而是输出前 384 位。因此它的十六进制结果固定为 96 个字符。

4. SHA-384 常见用途

SHA-384 并不像 SHA-256 那样常见于日常校验码,但它在安全协议和高强度摘要场景中很实用。

4.1 数字签名

在 RSA、ECDSA、EdDSA 等签名流程中,通常不会直接对完整大文件签名,而是先计算消息摘要,再对摘要或相关结构进行签名。SHA-384 常用于需要更高安全等级的签名组合,例如与 P-384 椭圆曲线搭配。

4.2 TLS 和证书体系

现代 TLS 配置和 X.509 证书体系中可以使用 SHA-384 作为签名摘要算法。它常见于高安全等级的证书链、服务器配置和企业安全策略中。

4.3 文件完整性校验

如果你发布的是长期保存、高价值或对完整性非常敏感的文件,SHA-384 可以提供比 SHA-256 更长的摘要和更高的碰撞安全余量。用户下载文件后重新计算 SHA-384,并与发布方提供的摘要对比,就能确认文件是否被篡改或损坏。

4.4 内容寻址和数据指纹

在归档系统、去重系统、对象存储和审计日志中,SHA-384 可以作为数据指纹使用。只要内容发生变化,摘要也会随之变化,因此它适合用于标识不可变对象。

5. SHA-384、SHA-256 与 SHA-512 的区别

算法输出长度分组大小工作字长十六进制长度常见选择理由
SHA-256256 位512 位32 位64 字符兼容性好,通用默认选择
SHA-384384 位1024 位64 位96 字符更高安全余量,常配合 P-384
SHA-512512 位1024 位64 位128 字符输出最长,适合需要完整 512 位摘要的场景

选择时可以参考以下原则:

  • 普通文件校验、API 签名、通用数据摘要:优先考虑 SHA-256
  • 与 384 位安全等级相关的签名、证书或协议:考虑 SHA-384
  • 需要完整 512 位摘要、内部系统可接受更长输出:考虑 SHA-512

在 64 位 CPU 上,SHA-384 和 SHA-512 的性能通常并不差,因为它们使用 64 位字运算;在某些场景下,它们甚至可能比 SHA-256 更快。实际性能仍取决于语言运行时、硬件指令集和实现方式。

6. SHA-384 是否安全?

截至目前,SHA-384 仍被认为适合现代安全用途。它属于 SHA-2 家族,尚没有实用的碰撞攻击能够破坏其安全目标。与 MD5 和 SHA-1 不同,SHA-384 没有被实际碰撞攻击淘汰。

不过,安全使用哈希算法仍要注意边界:

  • 不要把 SHA-384 当作加密算法,它不能隐藏明文
  • 不要把普通 SHA-384 直接用于密码存储,应使用 Argon2、bcrypt、scrypt 或 PBKDF2 等专用密码哈希方案
  • 不要用 SHA384(secret + message) 手写消息认证,应使用 HMAC-SHA-384
  • 不要只比较部分很短的摘要前缀,除非你清楚对应的碰撞风险
  • 不要忽略输入编码,文本在 UTF-8、UTF-16 或其他编码下会得到不同摘要

7. HMAC-SHA-384 与普通 SHA-384

普通 SHA-384 只负责把输入转换为摘要,不提供身份认证。如果你需要证明“消息确实来自持有密钥的一方,并且没有被篡改”,应使用 HMAC-SHA-384。

HMAC-SHA-384 会把密钥和消息按标准结构组合后再进行哈希,避免简单拼接密钥和消息带来的安全问题。它常用于 API 请求签名、Webhook 校验、服务间通信认证和安全令牌校验。

简单来说:

  • SHA-384:适合做公开数据的摘要和完整性指纹
  • HMAC-SHA-384:适合做带密钥的消息认证

8. 实践建议

在真实项目中使用 SHA-384 时,可以遵循这些建议:

  • 明确记录输入编码,例如统一使用 UTF-8
  • 文件校验时同时发布文件大小、哈希算法名称和摘要值
  • 摘要比较时使用完整字符串,并避免大小写、空格和换行差异
  • 安全协议中优先使用成熟库,不要自己实现 SHA-384 压缩函数
  • 密码存储使用专用密码哈希算法,而不是直接哈希密码
  • 需要带密钥校验时使用 HMAC-SHA-384,而不是自定义拼接规则

9. 总结

SHA-384 是 SHA-2 家族中兼具高安全余量和实用性的哈希算法。它输出 384 位摘要,通常显示为 96 个十六进制字符,适合数字签名、证书体系、文件完整性校验、数据指纹和高价值数据保护等场景。

如果你只是做通用校验,SHA-256 通常已经足够;如果你的系统需要更高安全等级,或者需要与 P-384、TLS、证书策略等体系配合,SHA-384 是一个稳健选择。需要在线计算时,可以直接使用 SHA 哈希生成器