What is a signature verifier?
A signature verifier takes a message, a digital signature and a public identity (an address or public key) and tells you whether that identity really produced the signature over exactly that message. On Ethereum the check is done by recovery: secp256k1 lets you compute the signer's public key from the signature and the message hash, hash it to an address, and compare. On Solana (ed25519) and for Bitcoin's SegWit and legacy message formats the same idea applies, with different hashing rules. This page implements all four conventions used by wallets today, in the browser, from public data only.
Supported signature types
| Type | Standard | Digest that is signed | Curve | Output |
|---|---|---|---|---|
| Ethereum personal_sign | EIP-191 (version 0x45) | keccak256("\x19Ethereum Signed Message:\n" + length + message) | secp256k1 | Recovered address, match badge, message hash |
| Ethereum typed data | EIP-712 (eth_signTypedData_v4) | keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message)) | secp256k1 | Domain separator, struct hash, digest, recovered signer |
| Solana signMessage | RFC 8032 Ed25519 | SHA-512 inside the EdDSA equation, no prefix | ed25519 | Valid / invalid |
| Bitcoin signed message | BIP-137 (Bitcoin Core signmessage) | SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + message) | secp256k1 | Recovered key, derived address, match |
How Ethereum recovery works
An ECDSA signature is the pair (r, s). Given the 32-byte digest and the recovery id v, there are at most two candidate public keys; v selects one. The tool computes the digest according to the selected standard, recovers the 64-byte public key, takes the last 20 bytes of its Keccak-256 hash to get the address, and compares it with the expected address if you gave one. Because the address is derived rather than looked up, a match proves possession of the key at signing time; no on-chain data is needed.
Worked example: EIP-712 Mail
Click "EIP-712 Mail" above. The typed data is the example from the EIP-712 specification: domain Ether Mail version 1 on chain 1 with verifying contract 0xcccc…cccc, and a Mail struct from Cow to Bob with contents "Hello, Bob!". The tool shows the domain separator 0xf2cee375…, the struct hash 0xc52c0ee5… and the final digest 0xbe609aee…, exactly the values printed in the specification's reference implementation, and then recovers the signer of the attached signature. Change one character of "Hello, Bob!" and the recovered address changes completely, which is the whole point of signing structured data.
Reading a Bitcoin message signature
The first byte of the base64 signature encodes both the recovery id and the address type the signer intended: 27–30 for P2PKH with an uncompressed key, 31–34 for P2PKH with a compressed key, 35–38 for P2SH-wrapped SegWit and 39–42 for native SegWit (bc1q). The tool recovers the key, derives all four address forms, and reports which one matches the address you supplied. Electrum and several other wallets sign bc1q addresses with the 31–34 header; that case is accepted and flagged with a note rather than rejected. Testnet addresses (m…, n…, 2…, tb1q…) are recognised from their prefix.
Common uses
- Sign-In with Ethereum / wallet login: confirm that the signature a client sent really belongs to the address it claims before accepting it on your backend.
- Permit and Permit2 approvals: paste the typed data a dApp asked you to sign and see the domain, spender and deadline that are actually bound by the signature.
- Proof of address ownership: exchanges and OTC desks ask for a signed message from a deposit or withdrawal address; verify it here before trusting it.
- Debugging: compare the hashes this page shows with what your library computed to find prefix, encoding or chainId mistakes.
Accepted input formats
- Ethereum signatures: 65-byte hex with v = 0, 1, 27 or 28, or 64-byte EIP-2098 compact signatures; with or without 0x.
- Messages: UTF-8 text, or hex bytes when the signer hashed raw bytes; Solana also accepts base64.
- Solana signatures: base58 (as returned by Phantom and Solflare), base64 or hex; public key as a base58 address or 32-byte hex.
- Bitcoin signatures: base64 as produced by signmessage, or the same 65 bytes in hex.
Related: compute Keccak-256 of a message yourself with the hash tool, fix an address checksum with the EIP-55 converter, or decode the transaction a signature was used in with the Ethereum transaction decoder.