Verificador de firmas cripto

Pega un mensaje, una firma y (opcionalmente) la dirección que afirma haberlo firmado. La herramienta recupera el firmante Ethereum, verifica firmas Solana ed25519 y Bitcoin BIP-137, y muestra cada hash intermedio. No se sube nada y nunca interviene una clave privada.

Ejemplos:

Se calcula en tu navegador con JavaScript. Las direcciones nunca se suben ni se almacenan.

¿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

TipoEstándarDigest que se firmaCurvaResultado
Ethereum personal_signEIP-191 (versión 0x45)keccak256("\x19Ethereum Signed Message:\n" + longitud + mensaje)secp256k1Dirección recuperada, indicador de coincidencia, hash del mensaje
Datos tipados de EthereumEIP-712 (eth_signTypedData_v4)keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message))secp256k1Separador de dominio, hash de estructura, digest, firmante recuperado
Solana signMessageRFC 8032 Ed25519SHA-512 dentro de la ecuación EdDSA, sin prefijoed25519Válida / inválida
Mensaje firmado de BitcoinBIP-137 (signmessage de Bitcoin Core)SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + mensaje)secp256k1Clave 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

Formatos de entrada aceptados

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.

Preguntas frecuentes

¿Cuál es la diferencia entre personal_sign y eth_signTypedData?

personal_sign (EIP-191) hashea el mensaje sin procesar con el prefijo \x19Ethereum Signed Message:\n más su longitud; la billetera muestra el texto pero no puede explicarlo. EIP-712 hashea una estructura tipada junto con un dominio (name, version, chainId, verifyingContract), de modo que las billeteras pueden mostrar cada campo y una firma para una dApp o cadena no puede reproducirse en otra. La matemática de recuperación es la misma; solo cambia el digest.

¿Por qué la dirección recuperada no coincide?

Casi siempre porque los bytes del mensaje difieren: un salto de línea final, finales de línea de Windows, una normalización Unicode distinta, o el texto se firmó como bytes en hex en lugar de UTF-8. En EIP-712, un chainId, verifyingContract o definición de tipos diferente cambia el separador de dominio y, por tanto, el firmante. La firma en sí rara vez está mal; compara los hashes que se muestran aquí con los que calculó tu código.

¿Qué significa el valor v?

El último byte de una firma Ethereum de 65 bytes es el id de recuperación: 27 o 28 en la codificación original de Ethereum, 0 o 1 en librerías más recientes, y en las firmas compactas EIP-2098 va plegado en el bit más alto de s. Todas las formas se aceptan y se normalizan antes de la recuperación.

¿La verificación de Solana necesita el RPC o la billetera?

No. signMessage de Solana produce una firma ed25519 simple sobre los bytes sin procesar, sin prefijo, así que la verificación solo necesita el mensaje, la firma de 64 bytes y la clave pública de 32 bytes (la dirección de la billetera). Esta página implementa la verificación RFC 8032 en JavaScript.

¿Qué formatos de firma de Bitcoin se admiten?

El formato clásico base64 de 65 bytes que producen signmessage de Bitcoin Core, Electrum, Sparrow y la mayoría de billeteras hardware (BIP-137): byte de cabecera 27–42, seguido de r y s. Se manejan direcciones legacy, SegWit anidado y SegWit nativo, incluida la costumbre de Electrum de usar la cabecera legacy para direcciones bc1q. Las firmas BIP-322 y Taproot (bc1p) usan un esquema distinto y no se admiten.

¿Esta herramienta puede firmar algo?

No. Firmar requiere una clave privada, y este sitio nunca genera, importa ni almacena claves. Solo verifica firmas a partir de datos públicos: el mensaje, la firma y la dirección o clave pública del firmante.

¿La firma se envía a un servidor?

No. Todo el hashing (Keccak-256, SHA-256, SHA-512) y la aritmética de curvas (recuperación secp256k1, operaciones de puntos ed25519) se ejecutan en tu navegador. La página no hace peticiones de red después de cargarse.