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位 - 继续追加若干个
0位 - 让填充后的长度满足
896 mod 1024 - 最后追加 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-256 | 256 位 | 512 位 | 32 位 | 64 字符 | 兼容性好,通用默认选择 |
| SHA-384 | 384 位 | 1024 位 | 64 位 | 96 字符 | 更高安全余量,常配合 P-384 |
| SHA-512 | 512 位 | 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 哈希生成器。