加密签名验证器

粘贴消息、签名以及(可选的)声称完成签名的地址。工具会恢复以太坊签名者、验证 Solana ed25519 与比特币 BIP-137 签名,并显示每一步中间哈希。不会上传任何内容,也绝不涉及私钥。

示例:

由浏览器中的 JavaScript 计算。地址不会被上传或存储。

什么是签名验证器?

签名验证器接收一条消息、一个数字签名和一个公开身份(地址或公钥),然后告诉你该身份是否确实对这条消息(且仅对这条消息)生成了这个签名。在以太坊上,这一检查通过恢复完成:secp256k1 允许你根据签名和消息哈希计算出签名者的公钥,再将其哈希为地址并进行比对。Solana(ed25519)以及比特币的 SegWit 与传统消息格式采用同样的思路,只是哈希规则不同。本页在浏览器中、仅凭公开数据实现了当今钱包使用的这四种约定。

支持的签名类型

类型标准被签名的摘要曲线输出
以太坊 personal_signEIP-191(版本 0x45)keccak256("\x19Ethereum Signed Message:\n" + length + message)secp256k1恢复出的地址、匹配标记、消息哈希
以太坊类型化数据EIP-712(eth_signTypedData_v4)keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message))secp256k1域分隔符、结构体哈希、摘要、恢复出的签名者
Solana signMessageRFC 8032 Ed25519EdDSA 方程内部的 SHA-512,无前缀ed25519有效 / 无效
比特币签名消息BIP-137(Bitcoin Core signmessage)SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + message)secp256k1恢复出的公钥、派生地址、是否匹配

以太坊签名恢复的原理

ECDSA 签名是一对数值 (r, s)。给定 32 字节摘要和恢复 id v,候选公钥至多有两个,v 决定选哪一个。工具按所选标准计算摘要,恢复出 64 字节公钥,取其 Keccak-256 哈希的最后 20 字节得到地址,若你提供了预期地址则再与之比对。由于地址是推导出来的而非查询得到的,匹配即证明签名时持有该私钥,无需任何链上数据。

实例演示:EIP-712 Mail

点击上方的“EIP-712 Mail”。该类型化数据来自 EIP-712 规范中的示例:域 Ether Mail、版本 1、链 ID 1,验证合约为 0xcccc…cccc,以及一个由 Cow 发给 Bob、内容为 “Hello, Bob!” 的 Mail 结构体。工具会显示域分隔符 0xf2cee375…、结构体哈希 0xc52c0ee5… 和最终摘要 0xbe609aee…,与规范参考实现打印的值完全一致,然后恢复出所附签名的签名者。把 “Hello, Bob!” 改动一个字符,恢复出的地址就会完全不同——这正是对结构化数据签名的意义所在。

解读比特币消息签名

base64 签名的第一个字节同时编码了恢复 id 和签名者预期的地址类型:27–30 表示使用未压缩公钥的 P2PKH,31–34 表示使用压缩公钥的 P2PKH,35–38 表示 P2SH 封装的 SegWit,39–42 表示原生 SegWit(bc1q)。工具恢复公钥后会派生出全部四种地址形式,并报告哪一种与你提供的地址匹配。Electrum 及其他一些钱包对 bc1q 地址签名时使用 31–34 的头字节;这种情况会被接受并附注说明,而不是拒绝。测试网地址(m…、n…、2…、tb1q…)通过前缀识别。

常见用途

接受的输入格式

相关工具:用哈希工具自行计算消息的 Keccak-256,用 EIP-55 转换器修正地址校验和,或用以太坊交易解码器解码使用了该签名的交易。

常见问题

personal_sign 和 eth_signTypedData 有什么区别?

personal_sign(EIP-191)对原始消息加上前缀 \x19Ethereum Signed Message:\n 及其长度后进行哈希;钱包能显示文本,却无法解释其含义。EIP-712 则将类型化结构与域(name、version、chainId、verifyingContract)一起哈希,因此钱包可以逐字段展示,且为某个 dApp 或链生成的签名无法在另一个上重放。两者的恢复运算相同,只是摘要不同。

为什么恢复出的地址不匹配?

几乎总是因为消息字节不同:末尾多了换行、使用了 Windows 行尾、Unicode 规范化方式不同,或者文本是按十六进制字节而非 UTF-8 签名的。对于 EIP-712,chainId、verifyingContract 或类型定义不同都会改变域分隔符,从而改变签名者。签名本身很少出错;请将本页显示的哈希与你代码计算的结果进行比对。

v 值是什么意思?

65 字节以太坊签名的最后一个字节是恢复 id:在以太坊最初的编码中为 27 或 28,在较新的库中为 0 或 1,在 EIP-2098 紧凑签名中则折叠进 s 的最高位。所有形式均可接受,并在恢复前进行归一化。

验证 Solana 签名需要 RPC 或钱包吗?

不需要。Solana signMessage 生成的是对原始字节的普通 ed25519 签名,没有前缀,因此验证只需要消息、64 字节签名和 32 字节公钥(即钱包地址)。本页用 JavaScript 实现了 RFC 8032 验证。

支持哪些比特币签名格式?

Bitcoin Core signmessage、Electrum、Sparrow 及大多数硬件钱包生成的经典 65 字节 base64 格式(BIP-137):头字节 27–42,随后是 r 和 s。支持传统地址、嵌套 SegWit 和原生 SegWit 地址,包括 Electrum 对 bc1q 地址沿用传统头字节的习惯。BIP-322 和 Taproot(bc1p)签名采用不同的方案,暂不支持。

这个工具能用来签名吗?

不能。签名需要私钥,而本站绝不生成、导入或存储密钥。它只根据公开数据——消息、签名以及签名者的地址或公钥——验证签名。

签名会被发送到服务器吗?

不会。所有哈希运算(Keccak-256、SHA-256、SHA-512)和曲线运算(secp256k1 恢复、ed25519 点运算)都在你的浏览器中执行。页面加载完成后不会发出任何网络请求。