¿Qué es un hash?
Un hash es una huella de un texto o de un archivo: un número de tamaño fijo que se calcula a partir de su contenido. El mismo texto da siempre el mismo hash, y si cambia una sola letra el hash cambia por completo. En los algoritmos criptográficos, además, no se puede volver atrás: con el hash no se puede saber el texto, salvo probando textos hasta dar con él.
Cada algoritmo da un hash distinto y de una longitud distinta. Aquí los tienes todos a la vez, agrupados por familias, para comparar con el que te ha dado un programa o una API.
Las familias de algoritmos
- SHA-2 (SHA-224, SHA-256, SHA-384 y SHA-512): el estándar más usado hoy. SHA-256 está en los certificados SSL, en las imágenes de Docker, en Bitcoin y en las firmas de las API.
- SHA-3: el estándar más reciente (2015), con un diseño interno distinto al de SHA-2, por si algún día se encontrara un fallo en este.
- Keccak: el algoritmo que ganó el concurso de SHA-3, tal como era antes de estandarizarlo. Da otro resultado que SHA-3 porque cambia un detalle del relleno. Keccak-256 es el hash de Ethereum: con él se calculan las direcciones y las firmas de las funciones de los contratos.
- BLAKE2 y BLAKE3: tan seguros como SHA-2 y más rápidos. BLAKE2b lo usan, por ejemplo, Argon2 y la librería libsodium.
- MD5 y SHA-1: los clásicos, que todavía se ven en sistemas antiguos. Ya no son seguros: se pueden fabricar dos textos con el mismo hash. MD4 es aún más antiguo, y es la base de los hashes NTLM de Windows.
- RIPEMD-160, Whirlpool y SM3: RIPEMD-160 se usa en las direcciones de Bitcoin; Whirlpool, en algunos programas de cifrado como VeraCrypt; y SM3 es el estándar de hash de China.
- Sumas de control (CRC32, CRC32C, CRC64, Adler-32 y xxHash): muy rápidas y cortas, pensadas para detectar errores en datos o archivos, no para la seguridad. Cualquiera puede fabricar un texto con la suma que quiera. CRC32 está en los ZIP y en Ethernet; Adler-32, en zlib y PNG.
¿Por qué mi hash no coincide?
Casi siempre es porque el texto no es exactamente el mismo:
- Un salto de línea al final.
echo "hola" | sha256sumcalcula el hash de «hola» más un salto de línea. Para que coincida con el de aquí, usaecho -noprintf '%s'. - Saltos de línea de Windows. En Windows cada línea acaba en dos caracteres (\r\n) y aquí, en uno (\n).
- La codificación. Aquí el texto se pasa a bytes en UTF-8. Si un programa usa Latin-1 o UTF-16, las letras con tilde, la ñ y los emojis dan otros bytes y otro hash.
- Espacios al principio o al final que no se ven.
- Bytes en vez de texto. Si lo que te dan es una clave o un dato binario en hexadecimal o en Base64, elige ese formato arriba: no es lo mismo el hash del texto «48656c6c6f» que el de los bytes que representa.
¿Cómo sé de qué algoritmo es un hash?
Por su longitud se descartan muchos: 32 caracteres hexadecimales son 128 bits (MD5, MD4 o XXH128), 40 son 160 bits (SHA-1 o RIPEMD-160) y 64 son 256 bits (SHA-256, SHA3-256, Keccak-256, BLAKE2s, BLAKE3…). Pero varios algoritmos dan la misma longitud, y el hash por sí solo no dice cuál es. Si tienes también el texto original, escríbelo arriba y pega el hash abajo: si es el de ese texto con alguno de los 30 algoritmos, te diremos con cuál.
Para guardar contraseñas no se usa ninguno de estos: son demasiado rápidos y se pueden probar miles de millones por segundo. Para eso están Argon2 y bcrypt. Y para el hash de un archivo, tienes el hash de un archivo.