piapia123
zh

SHA-3 / SHAKE / Keccak 哈希计算

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

一次覆盖建立在同一个置换上的三个哈希族。它们的实现是同一份代码,区别只在填充字节,而结果毫不相干 —— 这也是最容易踩的坑:SHA3-256 与 Keccak-256 不是一回事。NIST 在 2015 年定稿 SHA-3 时把填充从 `0x01` 改成了 `0x06`,就这一个字节,让两者算出的摘要完全不同。以太坊从第一天起用的就是原版 Keccak-256 —— 合约地址、交易哈希、事件 topic、ERC-20 的方法选择器全都建立在它之上,拿 SHA3-256 去核对会得到一个格式完全正确、但谁也认不出的值。三个族各有各的场合,下拉里已按族分好。

功能

  • 十个变体:SHA3-224/256/384/512、SHAKE128/256、Keccak-224/256/384/512
  • SHAKE 的输出长度可自定(1–512 字节),其余变体由标准固定
  • 原版 Keccak 与 SHA-3 分开列出 —— 以太坊用的是前者
  • 输出十六进制(可切大小写)或 Base64
  • 中文与 emoji 按 UTF-8 字节计算,与 openssl、与以太坊工具逐位一致
  • 自带实现,不依赖浏览器是否提供某个 SHA-3 变体

使用方法

  1. 把文本粘贴进输入框
  2. 选择变体(以太坊相关选 Keccak-256)
  3. SHAKE 需要的话设定输出长度
  4. 按 Ctrl/⌘ + Enter 或点「运行」,然后复制结果

常见问题

SHA3-256 和 Keccak-256 有什么区别?
只差一个填充字节,结果完全不同。 两者用的是同一个 Keccak-f[1600] 置换、同样的 136 字节块大小,唯一区别是吸收阶段结尾补的那个字节:原版 Keccak 补 0x01,NIST 定稿的 SHA-3 补 0x06。例如空字符串,Keccak-256 得到 c5d24601…,SHA3-256 得到 a7ffc6f8… —— 两者都格式正确,但没有一个字节相同。以太坊全程使用原版 Keccak,所以核对合约地址或交易哈希时必须选 Keccak-256。
SHAKE 是什么?为什么它能指定输出长度?
SHAKE 是可扩展输出函数(XOF)—— 它能挤出任意长度的输出,要多少给多少,而不是像 SHA-256 那样固定 32 字节。这不是「截断」,而是海绵结构本来的性质:每挤完一个块就再置换一次,可以一直挤下去。它适合需要变长输出的场景,比如从一份种子派生出多个密钥(KMAC、后量子签名里大量使用)。这里把输出长度上限设在 512 字节,实际几乎用不到那么大。
十个变体我该选哪个?
按用途分:以太坊、区块链相关一律选 Keccak-256(不要选 SHA3-256)。做 NIST 标准的新设计按需要的长度选 SHA3-224/256/384/512,其中 256 最常见。需要可变长输出(派生密钥、随机数扩展)选 SHAKE128(快)或 SHAKE256(安全余量更大)。Keccak-224/384/512 基本只在复现老系统或做算法对照时用到。
SHA-3 比 SHA-256 更安全吗?该迁移吗?
目前没有必要。SHA-256 至今没有实际可行的攻击,而 SHA-3 的优势在于结构完全不同:SHA-2 建立在 Merkle–Damgård 结构上,SHA-3 用的是海绵结构,两者的弱点不重叠。所以 SHA-3 的价值是「万一 SHA-2 哪天出问题,有一条现成的退路」,而不是「现在比 SHA-2 更强」。新系统选哪个都可以,选 SHA-256 兼容性更好、硬件支持更普遍。

相关工具