¿Qué es un verificador de firmas?
Un verificador de firmas toma un mensaje, una firma digital y una identidad pública (una dirección o una clave pública) y te dice si esa identidad produjo realmente la firma sobre exactamente ese mensaje. En Ethereum la comprobación se hace por recuperación: secp256k1 permite calcular la clave pública del firmante a partir de la firma y del hash del mensaje, convertirla en una dirección mediante hash y comparar. En Solana (ed25519) y en los formatos de mensaje SegWit y legacy de Bitcoin se aplica la misma idea, con reglas de hash distintas. Esta página implementa las cuatro convenciones que usan las billeteras hoy, en el navegador y solo a partir de datos públicos.
Tipos de firma admitidos
| Tipo | Estándar | Digest que se firma | Curva | Resultado |
|---|---|---|---|---|
| Ethereum personal_sign | EIP-191 (versión 0x45) | keccak256("\x19Ethereum Signed Message:\n" + longitud + mensaje) | secp256k1 | Dirección recuperada, indicador de coincidencia, hash del mensaje |
| Datos tipados de Ethereum | EIP-712 (eth_signTypedData_v4) | keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message)) | secp256k1 | Separador de dominio, hash de estructura, digest, firmante recuperado |
| Solana signMessage | RFC 8032 Ed25519 | SHA-512 dentro de la ecuación EdDSA, sin prefijo | ed25519 | Válida / inválida |
| Mensaje firmado de Bitcoin | BIP-137 (signmessage de Bitcoin Core) | SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + mensaje) | secp256k1 | Clave recuperada, dirección derivada, coincidencia |
Cómo funciona la recuperación en Ethereum
Una firma ECDSA es el par (r, s). Dado el digest de 32 bytes y el id de recuperación v, hay como máximo dos claves públicas candidatas; v selecciona una. La herramienta calcula el digest según el estándar elegido, recupera la clave pública de 64 bytes, toma los últimos 20 bytes de su hash Keccak-256 para obtener la dirección y la compara con la dirección esperada si indicaste una. Como la dirección se deriva en lugar de consultarse, una coincidencia demuestra la posesión de la clave en el momento de firmar; no hacen falta datos on-chain.
Ejemplo práctico: EIP-712 Mail
Pulsa "EIP-712 Mail" arriba. Los datos tipados son el ejemplo de la especificación EIP-712: dominio Ether Mail versión 1 en la cadena 1 con el contrato verificador 0xcccc…cccc, y una estructura Mail de Cow a Bob con el contenido "Hello, Bob!". La herramienta muestra el separador de dominio 0xf2cee375…, el hash de estructura 0xc52c0ee5… y el digest final 0xbe609aee…, exactamente los valores que imprime la implementación de referencia de la especificación, y después recupera el firmante de la firma adjunta. Cambia un solo carácter de "Hello, Bob!" y la dirección recuperada cambia por completo, que es precisamente el objetivo de firmar datos estructurados.
Cómo leer una firma de mensaje de Bitcoin
El primer byte de la firma base64 codifica tanto el id de recuperación como el tipo de dirección que el firmante quería usar: 27–30 para P2PKH con clave sin comprimir, 31–34 para P2PKH con clave comprimida, 35–38 para SegWit envuelto en P2SH y 39–42 para SegWit nativo (bc1q). La herramienta recupera la clave, deriva las cuatro formas de dirección e indica cuál coincide con la dirección que proporcionaste. Electrum y varias otras billeteras firman direcciones bc1q con la cabecera 31–34; ese caso se acepta y se marca con una nota en lugar de rechazarse. Las direcciones de testnet (m…, n…, 2…, tb1q…) se reconocen por su prefijo.
Usos habituales
- Sign-In with Ethereum / inicio de sesión con billetera: confirma que la firma que envió un cliente pertenece realmente a la dirección que afirma antes de aceptarla en tu backend.
- Aprobaciones Permit y Permit2: pega los datos tipados que una dApp te pidió firmar y mira el dominio, el spender y el plazo que la firma vincula realmente.
- Prueba de propiedad de una dirección: los exchanges y las mesas OTC piden un mensaje firmado desde una dirección de depósito o retiro; verifícalo aquí antes de confiar en él.
- Depuración: compara los hashes que muestra esta página con los que calculó tu librería para detectar errores de prefijo, codificación o chainId.
Formatos de entrada aceptados
- Firmas Ethereum: hex de 65 bytes con v = 0, 1, 27 o 28, o firmas compactas EIP-2098 de 64 bytes; con o sin 0x.
- Mensajes: texto UTF-8, o bytes en hex cuando el firmante hasheó bytes sin procesar; Solana también acepta base64.
- Firmas Solana: base58 (como las devuelven Phantom y Solflare), base64 o hex; clave pública como dirección base58 o hex de 32 bytes.
- Firmas Bitcoin: base64 como las produce signmessage, o los mismos 65 bytes en hex.
Relacionado: calcula tú mismo el Keccak-256 de un mensaje con la herramienta de hash, corrige el checksum de una dirección con el conversor EIP-55 o decodifica la transacción en la que se usó una firma con el decodificador de transacciones de Ethereum.