署名検証ツールとは
署名検証ツールは、メッセージ、デジタル署名、公開された識別子(アドレスまたは公開鍵)を受け取り、その識別子が本当にそのメッセージに対してその署名を生成したかどうかを判定します。Ethereum では復元によって検証します。secp256k1 では署名とメッセージハッシュから署名者の公開鍵を計算でき、それをハッシュしてアドレスにし、比較します。Solana(ed25519)や Bitcoin の SegWit / レガシーメッセージ形式でも同じ考え方が使われ、ハッシュの規則だけが異なります。このページは、今日のウォレットが使う 4 つの方式すべてを、公開データのみを使ってブラウザ内で実装しています。
対応する署名の種類
| 種類 | 規格 | 署名対象のダイジェスト | 曲線 | 出力 |
|---|---|---|---|---|
| Ethereum personal_sign | EIP-191(バージョン 0x45) | keccak256("\x19Ethereum Signed Message:\n" + length + message) | secp256k1 | 復元されたアドレス、一致バッジ、メッセージハッシュ |
| Ethereum 型付きデータ | EIP-712(eth_signTypedData_v4) | keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message)) | secp256k1 | ドメインセパレーター、構造体ハッシュ、ダイジェスト、復元された署名者 |
| Solana signMessage | RFC 8032 Ed25519 | EdDSA の式の内部で SHA-512、プレフィックスなし | ed25519 | 有効 / 無効 |
| Bitcoin 署名メッセージ | BIP-137(Bitcoin Core signmessage) | SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + message) | secp256k1 | 復元された鍵、導出アドレス、一致判定 |
Ethereum の復元の仕組み
ECDSA 署名は (r, s) の組です。32 バイトのダイジェストとリカバリー ID v が与えられると、候補となる公開鍵は最大 2 つあり、v がそのどちらかを選びます。ツールは選択した規格に従ってダイジェストを計算し、64 バイトの公開鍵を復元し、その Keccak-256 ハッシュの末尾 20 バイトをアドレスとして取り出し、想定アドレスが入力されていればそれと比較します。アドレスは参照ではなく導出されるため、一致すれば署名時点で鍵を保有していたことの証明になり、オンチェーンのデータは不要です。
実例: EIP-712 Mail
上の「EIP-712 Mail」をクリックしてください。この型付きデータは EIP-712 仕様の例そのもので、ドメインは Ether Mail バージョン 1、チェーン ID 1、検証コントラクト 0xcccc…cccc、そして Cow から Bob への Mail 構造体で、内容は「Hello, Bob!」です。ツールはドメインセパレーター 0xf2cee375…、構造体ハッシュ 0xc52c0ee5…、最終ダイジェスト 0xbe609aee… を表示します。これは仕様のリファレンス実装が出力する値と完全に一致し、その後、添付された署名の署名者を復元します。「Hello, Bob!」を 1 文字変えるだけで復元されるアドレスはまったく別のものになります。これこそが構造化データに署名する意味です。
Bitcoin メッセージ署名の読み方
base64 署名の先頭バイトには、リカバリー ID と署名者が意図したアドレス種別の両方がエンコードされています。27–30 は非圧縮鍵の P2PKH、31–34 は圧縮鍵の P2PKH、35–38 は P2SH でラップした SegWit、39–42 はネイティブ SegWit(bc1q)です。ツールは鍵を復元して 4 種類すべてのアドレス形式を導出し、入力したアドレスにどれが一致するかを報告します。Electrum をはじめいくつかのウォレットは bc1q アドレスに 31–34 のヘッダーで署名しますが、この場合は拒否せず、注記付きで受け入れます。テストネットアドレス(m…、n…、2…、tb1q…)はプレフィックスから認識されます。
主な用途
- Sign-In with Ethereum / ウォレットログイン: クライアントから送られた署名が、主張しているアドレスのものであることをバックエンドで受け入れる前に確認します。
- Permit と Permit2 の承認: dApp に署名を求められた型付きデータを貼り付け、署名が実際に拘束するドメイン、spender、deadline を確認します。
- アドレス所有権の証明: 取引所や OTC デスクは入出金アドレスで署名したメッセージを求めてきます。信頼する前にここで検証してください。
- デバッグ: このページが表示するハッシュをライブラリの計算結果と比較し、プレフィックス、エンコーディング、chainId の誤りを見つけます。
受け付ける入力形式
- Ethereum 署名: v = 0、1、27 または 28 の 65 バイト hex、または 64 バイトの EIP-2098 コンパクト署名。0x の有無は問いません。
- メッセージ: UTF-8 テキスト、または署名者が生のバイト列をハッシュした場合は hex バイト列。Solana は base64 も受け付けます。
- Solana 署名: base58(Phantom や Solflare が返す形式)、base64 または hex。公開鍵は base58 アドレスまたは 32 バイトの hex。
- Bitcoin 署名: signmessage が生成する base64、または同じ 65 バイトの hex。
関連: ハッシュツールでメッセージの Keccak-256 を自分で計算する、EIP-55 コンバーターでアドレスのチェックサムを修正する、Ethereum トランザクションデコーダーで署名が使われたトランザクションをデコードする。