首页/安全/加密与证书速查/SHAKE 可扩展输出函数(XOF)
加密算法基础95 条

SHAKE 可扩展输出函数(XOF)

FIPS 202 中的 SHAKE128/SHAKE256:可按需要输出任意长度,用于哈希到指定长度、后量子算法内部扩展与随机字节派生。

加密与证书速查安全更新于 2026-10-13

SHAKE 是什么

SHAKE 是 FIPS 202 定义的可扩展输出函数(XOF,eXtendable Output Function):SHAKE128 与 SHAKE256 基于 Keccak 海绵结构,可以在调用时指定任意输出长度,而不像 SHA-256 那样固定输出 32 字节。它的安全强度分别对应 128 位与 256 位,常用于密钥派生、把随机比特扩展到协议要求的长度,以及后量子签名与密钥封装算法内部的哈希与扩展。它属于 SHA-3 家族,可以理解为固定输出长度哈希的推广。

基本信息

标准FIPS 202 §6.2
变体SHAKE128、SHAKE256(对应 128 / 256 位安全强度)
输出任意长度,由调用方指定(如 xoflen)
常用工具openssl dgst -shake256 -xoflen;Python hashlib.shake_256
与 SHA-3 关系同属 Keccak 家族,SHA3-256 可视为固定长度特例
抗长度扩展海绵结构天然不受长度扩展攻击影响

典型使用场景

  • 协议需要比 SHA-256 更长的摘要,或需要从一个输入派生多段密钥流
  • 后量子算法内部用于采样、扩展与哈希到定长(如 ML-KEM、ML-DSA)
  • 库设计中用同一原语覆盖多种摘要长度需求,减少算法分支
  • 需要自定义长度指纹的校验与分析场景(长度必须与对端约定一致)
  • 替代「哈希后再拼接」的多段输出写法,减少实现错误

按需输出长度

按需输出长度
openssl dgst -shake256 -xoflen 64 file.bin    # 输出 64 字节摘要
# Python
import hashlib
hashlib.shake_256(b'data').hexdigest(64)       # 输出 64 字节(hex 128 字符)
hashlib.shake_128(b'data').digest(16)          # 输出 16 字节原始数据
# hashlib 的 shake 只能在调用时给长度,不能像 sha256 那样省略

SHAKE 与固定哈希

对比项SHAKE128 / 256SHA-256
输出长度调用时指定固定 32 字节
标准出处FIPS 202FIPS 180-4
主要用途KDF、PQC 内部、可变长度摘要通用摘要、签名与完整性
长度关系长输出以短输出为前缀,但适用性仍需协议定义截断使用会削弱强度
输出长度属于协议约定:同一输入取 32 字节与取 64 字节虽然存在前缀关系,但双方长度不一致会派生出不同密钥,握手或解密会失败且难以定位。部分旧工具链不支持 -xoflen 选项,脚本化前先确认 openssl 版本。

易错点

  • 双方输出长度约定不一致 → 派生密钥不同,接口或数据解密失败,排查成本高
  • 在不同系统对同一数据使用不同 SHAKE 长度并当成同一指纹 → 比对逻辑失效,去重出现重复
  • 脚本里依赖 -xoflen 选项但环境是旧版 openssl → 直接报未知选项,需升级或改用库调用
  • 把 XOF 当成加密或认证手段 → 它是哈希族函数,不提供机密性

数据来源与参考

  • FIPS 202 §6.2(SHAKE)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌