SHA-3 是什么
SHA-3 是 NIST 通过 FIPS 202(2015 年)发布的哈希标准,算法核心是 Keccak 的海绵结构。与 SHA-2 的 Merkle-Damgard 迭代不同,海绵结构先吸收整条消息再挤压出输出,内部状态不直接暴露,因此天然不受长度扩展攻击影响。它与 SHA-2 是并列标准而不是替代品:SHA-2 并未被攻破,SHA-3 的价值主要在于提供结构完全不同的备份方案,以及 SHAKE 这类可变长输出能力。
基本信息
| 标准 | FIPS 202(2015 年发布) |
|---|---|
| 家族 | SHA3-224/256/384/512、SHAKE128/SHAKE256 |
| 结构 | 海绵结构(吸收阶段 + 挤压阶段) |
| 容量与速率 | 容量决定安全强度,速率影响性能 |
| 与 SHA-2 关系 | 并列标准,生态支持度略低 |
| 扩展输出 | SHAKE 支持任意长度输出,可当 XOF 使用 |
典型使用场景
- 需要与 SHA-2 结构解耦的备份方案:算法多样性或合规明确要求时
- 用 SHAKE 做可变长输出:密钥派生、随机数扩展、需要任意长度摘要的场合
- 区块链与智能合约环境:Keccak-256 变体被广泛使用,注意与 SHA3-256 区分
- 文件完整性交叉核验:与 SHA-256 并行计算,避免单一算法实现缺陷带来盲区
计算 SHA-3
计算 SHA-3
# 命令行:默认十六进制输出,注意算法名里带连字符
printf abc | openssl dgst -sha3-256
sha3sum -a 512 file.bin # 部分发行版需单独安装该工具
# Python
import hashlib
hashlib.sha3_512(b'abc').hexdigest()
hashlib.shake_128(b'abc').hexdigest(32) # SHAKE 可变长输出,必须指定字节数家族对照
| 算法 | 输出长度 | 抗碰撞强度 | 说明 |
|---|---|---|---|
| SHA3-256 | 256 位 | 约 128 位 | 与 SHA-256 强度相当 |
| SHA3-512 | 512 位 | 约 256 位 | 高安全等级场景 |
| SHAKE128 | 可变 | 取决于输出长度 | 可作 XOF 或派生函数 |
| Keccak-256 | 256 位 | 同量级 | 以太坊使用,域填充与 SHA3-256 不同 |
SHA-3 的抗碰撞强度约为输出长度的一半:选 SHA3-256 得到的抗碰撞强度与 SHA-256 相当,需要更高强度时升到 SHA3-512 而不是去改参数。
跨系统对接先用已知向量对齐:SHA3-256 与 Keccak-256 的填充规则不同,同一输入输出完全不同。用空串与 abc 这类公开向量在双方各跑一次,能快速确认用的是哪一种。
不要期待 SHA-3 更快:软件实现通常与 SHA-2 相近甚至略慢,而带 SHA 扩展指令的 CPU 会让 SHA-2 明显占优。SHA-3 的收益在结构安全性与 XOF 能力,不在速度。