O que é um verificador de assinaturas?
Um verificador de assinaturas recebe uma mensagem, uma assinatura digital e uma identidade pública (um endereço ou uma chave pública) e informa se essa identidade realmente produziu a assinatura sobre exatamente aquela mensagem. Na Ethereum, a verificação é feita por recuperação: a secp256k1 permite calcular a chave pública do signatário a partir da assinatura e do hash da mensagem, aplicar hash para obter um endereço e comparar. Na Solana (ed25519) e nos formatos de mensagem SegWit e legacy do Bitcoin vale a mesma ideia, com regras de hash diferentes. Esta página implementa as quatro convenções usadas pelas carteiras hoje, no navegador, apenas a partir de dados públicos.
Tipos de assinatura suportados
| Tipo | Padrão | Digest que é assinado | Curva | Resultado |
|---|---|---|---|---|
| Ethereum personal_sign | EIP-191 (versão 0x45) | keccak256("\x19Ethereum Signed Message:\n" + comprimento + mensagem) | secp256k1 | Endereço recuperado, indicador de correspondência, hash da mensagem |
| Dados tipados Ethereum | EIP-712 (eth_signTypedData_v4) | keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message)) | secp256k1 | Separador de domínio, hash da struct, digest, signatário recuperado |
| Solana signMessage | RFC 8032 Ed25519 | SHA-512 dentro da equação EdDSA, sem prefixo | ed25519 | Válida / inválida |
| Mensagem assinada do Bitcoin | BIP-137 (signmessage do Bitcoin Core) | SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + mensagem) | secp256k1 | Chave recuperada, endereço derivado, correspondência |
Como funciona a recuperação na Ethereum
Uma assinatura ECDSA é o par (r, s). Dado o digest de 32 bytes e o id de recuperação v, existem no máximo duas chaves públicas candidatas; v seleciona uma delas. A ferramenta calcula o digest conforme o padrão escolhido, recupera a chave pública de 64 bytes, pega os últimos 20 bytes do seu hash Keccak-256 para obter o endereço e o compara com o endereço esperado, se você informou um. Como o endereço é derivado, e não consultado, uma correspondência prova a posse da chave no momento da assinatura; nenhum dado on-chain é necessário.
Exemplo prático: EIP-712 Mail
Clique em "EIP-712 Mail" acima. Os dados tipados são o exemplo da especificação EIP-712: domínio Ether Mail versão 1 na chain 1 com o contrato verificador 0xcccc…cccc, e uma struct Mail de Cow para Bob com o conteúdo "Hello, Bob!". A ferramenta mostra o separador de domínio 0xf2cee375…, o hash da struct 0xc52c0ee5… e o digest final 0xbe609aee…, exatamente os valores impressos pela implementação de referência da especificação, e em seguida recupera o signatário da assinatura anexada. Altere um único caractere de "Hello, Bob!" e o endereço recuperado muda completamente, que é justamente o objetivo de assinar dados estruturados.
Como ler uma assinatura de mensagem do Bitcoin
O primeiro byte da assinatura base64 codifica tanto o id de recuperação quanto o tipo de endereço pretendido pelo signatário: 27–30 para P2PKH com chave não comprimida, 31–34 para P2PKH com chave comprimida, 35–38 para SegWit encapsulado em P2SH e 39–42 para SegWit nativo (bc1q). A ferramenta recupera a chave, deriva as quatro formas de endereço e informa qual delas corresponde ao endereço que você forneceu. O Electrum e várias outras carteiras assinam endereços bc1q com o cabeçalho 31–34; esse caso é aceito e sinalizado com uma nota, em vez de rejeitado. Endereços de testnet (m…, n…, 2…, tb1q…) são reconhecidos pelo prefixo.
Usos comuns
- Sign-In with Ethereum / login com carteira: confirme que a assinatura enviada por um cliente pertence de fato ao endereço que ele alega antes de aceitá-la no seu backend.
- Aprovações Permit e Permit2: cole os dados tipados que um dApp pediu para você assinar e veja o domínio, o spender e o prazo que a assinatura realmente vincula.
- Prova de posse de endereço: exchanges e mesas OTC pedem uma mensagem assinada a partir de um endereço de depósito ou saque; verifique-a aqui antes de confiar nela.
- Depuração: compare os hashes mostrados nesta página com os que a sua biblioteca calculou para encontrar erros de prefixo, codificação ou chainId.
Formatos de entrada aceitos
- Assinaturas Ethereum: hex de 65 bytes com v = 0, 1, 27 ou 28, ou assinaturas compactas EIP-2098 de 64 bytes; com ou sem 0x.
- Mensagens: texto UTF-8, ou bytes em hex quando o signatário aplicou hash a bytes brutos; a Solana também aceita base64.
- Assinaturas Solana: base58 (como retornado por Phantom e Solflare), base64 ou hex; chave pública como endereço base58 ou hex de 32 bytes.
- Assinaturas Bitcoin: base64 como produzido por signmessage, ou os mesmos 65 bytes em hex.
Relacionado: calcule você mesmo o Keccak-256 de uma mensagem com a ferramenta de hash, corrija o checksum de um endereço com o conversor EIP-55 ou decodifique a transação em que uma assinatura foi usada com o decodificador de transações Ethereum.