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 变体
使用方法
- 把文本粘贴进输入框
- 选择变体(以太坊相关选 Keccak-256)
- SHAKE 需要的话设定输出长度
- 按 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 兼容性更好、硬件支持更普遍。
相关工具
哈希计算
编码算出文本的 MD5、SHA-1、SHA-256 或 SHA-512 摘要,也可算老系统用的 MD4 与 MD2,中文按 UTF-8 字节计算。全部在本地完成。
RIPEMD-160
编码计算文本的 RIPEMD-160 摘要,可切换成比特币地址用的 HASH160,输出十六进制或 Base64,全部在浏览器本地完成。
HMAC 签名
编码用密钥与消息算出 HMAC 签名,含空格与中文的密钥也能与 Node、Java、Python 算出一致结果。密钥只在本机参与运算,不会发出去。
Base64 编解码
编码把文本转成 Base64,或把 Base64 还原成文本,中文与 emoji 都按 UTF-8 正确处理。全部在浏览器本地完成,内容不上传。
URL 编解码
编码把中文、空格与符号转义成 %XX,或把 %XX 还原成文本;整条 URL 与单独的参数值要选对方式,选错不会报错,但链接会打不开。全部在浏览器本地完成。
HTML 实体编解码
编码把 < > & 与引号转成 HTML 实体,也能把实体还原成字符,而且只解一遍:&lt; 得到的是 < 而不是尖括号。全部在浏览器本地完成。