Generador de Hash, HMAC y checksum de archivos

Hashes de texto, HMAC y verificación de archivos

Hashes de texto, HMAC y verificación de archivos

0 caracteres
MD5—
SHA-1—
SHA-256—
SHA-512—

Acerca de Generador de Hash, HMAC y checksum de archivos

La herramienta tiene tres modos. Hash de texto convierte lo que escribes a bytes UTF-8 y calcula a la vez MD5, SHA-1, SHA-256 y SHA-512. HMAC toma una clave secreta y un mensaje y genera HMAC-SHA-1/256/384/512 en hexadecimal o Base64. Suma de verificación de archivos lee el archivo en bloques de 8 MB, calcula en una sola pasada los que elijas entre CRC32, MD5, SHA-1, SHA-256, SHA-384 y SHA-512 y lo compara con el valor esperado que pegues.

Los tres usan la misma pieza, pero responden a preguntas distintas. Un checksum dice si el archivo que recibiste es el que se publicó. Un HMAC dice si el mensaje lo generó alguien que tiene la clave y si llegó sin cambios. Un hash a secas no responde a lo segundo, y ninguno de los tres sirve para guardar contraseñas.

Un byte distinto cambia todo el resultado

Una función hash convierte una entrada de cualquier tamaño en un resumen de longitud fija: 128 bits en MD5 (32 caracteres hexadecimales), 160 en SHA-1 (40), 256 en SHA-256 (64) y 512 en SHA-512 (128). Un cambio mínimo altera todo: el SHA-256 de «hola» y de «Hola» difiere desde el primer carácter.

Dos textos que se ven iguales pueden ser bytes distintos, y el sospechoso habitual es el salto de línea. En una terminal, echo hello | md5sum da b1946ac9… porque echo añade un salto de línea; escribir hello aquí da 5d41402a…. Los finales CRLF de Windows, un espacio arrastrado al copiar y la normalización Unicode (una «ñ» o una «á» pueden guardarse como un carácter o como letra más tilde combinada, algo común en nombres de archivo de macOS) producen el mismo desajuste.

MD5 y SHA-1 están «rotos», pero ¿qué se rompió exactamente?

A un hash criptográfico se le piden tres cosas: que a partir del resumen no se pueda hallar una entrada (resistencia a preimagen); que, dado un archivo, no se pueda fabricar otro con el mismo resumen (segunda preimagen); y que no se puedan encontrar dos entradas cualesquiera que colisionen (resistencia a colisiones). En MD5 y SHA-1 cayó la tercera.

El equipo de Wang Xiaoyun publicó colisiones de MD5 en 2004, y el RFC 6151 (2011) recoge que hacia 2006 bastaba alrededor de un minuto en un portátil. En febrero de 2017, CWI Ámsterdam y Google presentaron SHAttered: dos PDF distintos con el mismo SHA-1, obtenidos con unos nueve trillones (9×10^18) de cálculos SHA-1, el equivalente a 6.500 años de CPU y 110 de GPU. En 2020, Gaëtan Leurent y Thomas Peyrin lograron una colisión de prefijo elegido, en la que el atacante fija el comienzo de ambas entradas, por unos 75.000 dólares de GPU alquilada. El NIST anunció en diciembre de 2022 que SHA-1 debe retirarse antes del 31 de diciembre de 2030.

Una colisión es peligrosa cuando el atacante controla los dos documentos: prepara un contrato inocente y otro perjudicial con el mismo resumen, consigue la firma del primero y la firma vale para el segundo. Crear un archivo nuevo que coincida con un resumen ya publicado por otro es una segunda preimagen, y no se conoce ningún método práctico ni siquiera para MD5. Por eso un checksum MD5 sigue sirviendo para detectar una descarga corrupta; para garantizar autenticidad frente a un distribuidor que podría ser hostil, usa SHA-256.

Modo checksum: lo que prueba y lo que no prueba una coincidencia

Puedes pegar tal cual el contenido de un archivo SHA256SUMS de la página de descarga. La herramienta entiende el formato GNU (hash, dos espacios, nombre) y el BSD (SHA256 (archivo) = hash); si hay varias líneas, elige la que coincide con el nombre del archivo que arrastraste. Sin etiqueta, deduce el algoritmo por la longitud: 8 caracteres CRC32, 32 MD5, 40 SHA-1, 64 SHA-256, 96 SHA-384, 128 SHA-512.

Que coincida significa que tienes el archivo que la página describe. Si alguien tomó el servidor y cambió a la vez el archivo y la lista de sumas, seguirá coincidiendo. Por eso las distribuciones Linux firman SHA256SUMS con GPG, y es esa firma la que vincula el archivo con quien lo publica. Esta herramienta llega hasta la comparación de resúmenes.

CRC32 no es un hash criptográfico: es un código de detección de errores de ZIP, PNG o Ethernet, y ajustar cuatro bytes de un archivo para obtener el CRC32 que se quiera es aritmética sencilla. Úsalo solo para daños accidentales.

Modo HMAC: por qué SHA-256(clave + mensaje) no basta

Para firmar peticiones a una API o verificar webhooks parece suficiente poner el secreto delante y calcular el hash. MD5, SHA-1 y SHA-256 siguen la construcción Merkle–Damgård y sufren el ataque de extensión de longitud: el resumen es el estado interno final, así que quien conozca H(secreto‖mensaje) y la longitud del mensaje puede calcular H(secreto‖mensaje‖relleno‖extra) sin el secreto. En la práctica, falsificar una firma válida para una petición con «&amount=9999» añadido al final.

HMAC (RFC 2104) combina la clave con dos rellenos distintos (ipad 0x36, opad 0x5c) y aplica el hash dos veces, interior y exterior. Como el exterior envuelve el resultado interior, la extensión no funciona. Por la misma razón HMAC-MD5 y HMAC-SHA-1 apenas se ven afectados por las colisiones, aunque el RFC 6151 recomienda no incluir HMAC-MD5 en protocolos nuevos.

El campo de clave se interpreta como texto en UTF-8. Si un servicio te da la clave como cadena hexadecimal o Base64, revisa su documentación: unos esperan los bytes decodificados y otros usan la cadena literal. Las claves más largas que el bloque del hash (64 bytes en SHA-256, 128 en SHA-384/512) se reducen primero con un hash, como marca la especificación.

No guardes contraseñas con estos hashes

MD5 y la familia SHA están pensados para ser rápidos, justo lo que conviene al verificar una descarga de 4 GB y lo que no conviene con contraseñas: quien tenga un resumen filtrado puede probar candidatas a un ritmo enorme. El MD5 de «password», 5f4dcc3b5aa765d61d8327deb882cf99, se revierte con una simple búsqueda web. Para contraseñas se usa una función con sal y lenta a propósito, como bcrypt, scrypt o Argon2.

Ejemplos

Un solo salto de línea

Entrada
Modo texto, MD5: hello / hello seguido de salto de línea
Resultado
5d41402abc4b2a76b9719d911017c592 / b1946ac92492d2347c6235b4d2611184

El segundo valor es el que da echo hello | md5sum en Linux. Si tu resumen no coincide con el del servidor, revisa primero saltos de línea y espacios finales.

El ejemplo clásico de HMAC-SHA256

Entrada
Clave: key / Mensaje: The quick brown fox jumps over the lazy dog
Resultado
hex f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 / Base64 97yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg=

Si en modo texto concatenas «keyThe quick…» y calculas SHA-256, sale 51729876…. El hash con la clave delante y el HMAC no tienen relación, así que un servidor que espera uno rechazará el otro.

Verificar una ISO

Entrada
Arrastra la ISO al modo checksum y pega la lista SHA256SUMS completa
Resultado
Se toma la línea con el mismo nombre de archivo, se compara como SHA-256 y se marca coincide / no coincide

Los archivos de varios GB se leen de 8 MB en 8 MB, con poco consumo de memoria. Una discrepancia suele indicar una descarga interrumpida o una versión distinta de la listada.

Cómo se usa

  1. Elige una pestaña: hash de texto, HMAC o checksum de archivo.
  2. Escribe el texto, o la clave y el mensaje, o arrastra el archivo.
  3. En modo checksum, pega el valor publicado para compararlo.
  4. Copia el resultado con el botón que tiene al lado.

Términos clave

Colisión
Dos entradas distintas con el mismo resumen. En MD5 y SHA-1 se pueden fabricar si el atacante elige ambas.
Extensión de longitud
Calcular H(secreto‖mensaje‖extra) a partir de H(secreto‖mensaje) sin conocer el secreto. HMAC y SHA-3 son inmunes.
CRC32
Código de 32 bits para detectar errores de transmisión; no protege contra cambios deliberados.

Preguntas frecuentes

¿Se puede desencriptar un MD5?

Un hash no es cifrado, así que no hay nada que desencriptar. Las entradas cortas o comunes se encuentran calculando el hash de muchísimos candidatos y comparando, que es lo que hace el descifrador de hashes del sitio.

¿SHA-256 o SHA-512?

Ambos son seguros de sobra. Si tienes que coincidir con otro sistema, usa el suyo; las listas de checksums publicadas suelen ser SHA-256.

El checksum publicado está en mayúsculas y el mío en minúsculas.

El hexadecimal no distingue mayúsculas. La herramienta pasa ambos a minúsculas antes de comparar.

¿El modo archivo comprueba SHA-512?

Sí. El modo archivo admite CRC32, MD5, SHA-1, SHA-256, SHA-384 y SHA-512. Si pegas una línea de SHA512SUMS, reconoce la longitud de 128 caracteres y activa SHA-512 solo. Eso sí, el SHA-512 implementado en el navegador es de tres a cuatro veces más lento que SHA-256, así que un archivo de varios GB puede tardar más de un minuto.

La firma de mi webhook nunca coincide.

Casi siempre el mensaje no son los mismos bytes que firmó el emisor. Si parseas el JSON y lo vuelves a serializar cambian los espacios y el orden de las claves; usa el cuerpo tal como llegó.

Guías relacionadas

Fuentes

Revisado el:

Privacidad y tratamiento de datos