Verificador de assinaturas cripto

Cole uma mensagem, uma assinatura e (opcionalmente) o endereço que afirma tê-la assinado. A ferramenta recupera o signatário Ethereum, verifica assinaturas Solana ed25519 e Bitcoin BIP-137 e mostra cada hash intermediário. Nada é enviado e nenhuma chave privada é envolvida.

Exemplos:

Calculado no seu navegador com JavaScript. Os endereços nunca são enviados nem armazenados.

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

TipoPadrãoDigest que é assinadoCurvaResultado
Ethereum personal_signEIP-191 (versão 0x45)keccak256("\x19Ethereum Signed Message:\n" + comprimento + mensagem)secp256k1Endereço recuperado, indicador de correspondência, hash da mensagem
Dados tipados EthereumEIP-712 (eth_signTypedData_v4)keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message))secp256k1Separador de domínio, hash da struct, digest, signatário recuperado
Solana signMessageRFC 8032 Ed25519SHA-512 dentro da equação EdDSA, sem prefixoed25519Válida / inválida
Mensagem assinada do BitcoinBIP-137 (signmessage do Bitcoin Core)SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + mensagem)secp256k1Chave 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

Formatos de entrada aceitos

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.

Perguntas frequentes

Qual é a diferença entre personal_sign e eth_signTypedData?

O personal_sign (EIP-191) aplica hash à mensagem bruta com o prefixo \x19Ethereum Signed Message:\n mais o seu comprimento; a carteira mostra o texto, mas não consegue explicá-lo. O EIP-712 aplica hash a uma estrutura tipada junto com um domínio (name, version, chainId, verifyingContract), de modo que as carteiras podem exibir cada campo e uma assinatura feita para um dApp ou chain não pode ser reproduzida em outro. A matemática de recuperação é a mesma; só o digest muda.

Por que o endereço recuperado não corresponde?

Quase sempre porque os bytes da mensagem são diferentes: uma quebra de linha no final, finais de linha do Windows, uma normalização Unicode diferente, ou o texto foi assinado como bytes em hex em vez de UTF-8. No EIP-712, um chainId, verifyingContract ou definição de tipos diferente altera o separador de domínio e, portanto, o signatário. A assinatura em si raramente está errada; compare os hashes mostrados aqui com os que o seu código calculou.

O que significa o valor v?

O último byte de uma assinatura Ethereum de 65 bytes é o id de recuperação: 27 ou 28 na codificação original da Ethereum, 0 ou 1 em bibliotecas mais recentes, e nas assinaturas compactas EIP-2098 ele fica embutido no bit mais alto de s. Todas as formas são aceitas e normalizadas antes da recuperação.

A verificação na Solana precisa do RPC ou da carteira?

Não. O signMessage da Solana produz uma assinatura ed25519 simples sobre os bytes brutos, sem prefixo, então a verificação só precisa da mensagem, da assinatura de 64 bytes e da chave pública de 32 bytes (o endereço da carteira). Esta página implementa a verificação RFC 8032 em JavaScript.

Quais formatos de assinatura do Bitcoin são suportados?

O formato clássico base64 de 65 bytes produzido pelo signmessage do Bitcoin Core, Electrum, Sparrow e pela maioria das carteiras de hardware (BIP-137): byte de cabeçalho 27–42, seguido de r e s. Endereços legacy, SegWit aninhado e SegWit nativo são tratados, incluindo o hábito do Electrum de usar o cabeçalho legacy para endereços bc1q. Assinaturas BIP-322 e Taproot (bc1p) usam um esquema diferente e não são suportadas.

Esta ferramenta consegue assinar alguma coisa?

Não. Assinar exige uma chave privada, e este site nunca gera, importa nem armazena chaves. Ele apenas verifica assinaturas a partir de dados públicos: a mensagem, a assinatura e o endereço ou a chave pública do signatário.

A assinatura é enviada a um servidor?

Não. Todo o hashing (Keccak-256, SHA-256, SHA-512) e a aritmética de curvas (recuperação secp256k1, operações de pontos ed25519) rodam no seu navegador. A página não faz requisições de rede depois de carregada.