Para qué sirve un hash
Una función hash criptográfica convierte una entrada de cualquier tamaño en una huella de longitud fija. La misma entrada produce siempre el mismo resumen, y cambiar un solo bit de la entrada produce uno completamente distinto. No se puede reconstruir la entrada a partir del resumen y, con los algoritmos modernos, en la práctica no se pueden encontrar dos entradas con el mismo resumen.
Eso hace que los hashes sean útiles siempre que necesitas saber si dos cosas son idénticas sin compararlas byte a byte:
- Verificar descargas. Las ISO de Linux, las imágenes de firmware y muchos instaladores publican un SHA-256 junto al enlace de descarga. Si tu archivo da el mismo valor, ha llegado intacto.
- Detectar duplicados. Dos fotos o documentos con el mismo SHA-256 son el mismo archivo, se llamen como se llamen.
- Claves de caché y ETags. Los servidores web y las herramientas de compilación calculan el hash del contenido para saber si ha cambiado.
- Integridad en las API. Los webhooks, los archivos de bloqueo de paquetes y los atributos de Subresource Integrity se basan en resúmenes.
- Depuración. Comparar el hash que calcula tu código con un valor de referencia muestra rápidamente si el fallo está en el cálculo del hash o en la entrada.
Los cinco algoritmos, uno al lado del otro
La herramienta calcula los cinco a la vez, así que puedes cotejar el formato que publique cualquier sitio.
- MD5, 128 bits, 32 caracteres hexadecimales. Diseñado en 1991. Desde 2004 es posible generar colisiones en la práctica, así que no debe usarse donde un atacante pueda fabricar la entrada. Sigue siendo habitual para comprobaciones rápidas de duplicados y sumas de verificación heredadas.
- SHA-1, 160 bits, 40 caracteres hexadecimales. Obsoleto desde la primera colisión pública en 2017. Git identificaba históricamente los objetos por SHA-1, y por eso sigue estando en todas partes.
- SHA-256, 256 bits, 64 caracteres hexadecimales. El estándar actual para sumas de verificación, certificados, gestores de paquetes y blockchains.
- SHA-384, 384 bits, 96 caracteres hexadecimales. Una variante truncada de SHA-512, muy usada en TLS y en los hashes de Subresource Integrity.
- SHA-512, 512 bits, 128 caracteres hexadecimales. De la misma familia que SHA-256 pero con operaciones internas de 64 bits, lo que puede hacerlo más rápido que SHA-256 en procesadores de 64 bits.
Si puedes elegir, publica y comprueba SHA-256. MD5 y SHA-1 solo son aceptables para detectar daños accidentales, no manipulaciones.
Conseguir el mismo hash para un texto
Cuando tu resumen no coincide con el de otra persona para el «mismo» texto, casi nunca es realmente la misma entrada. Qué revisar:
- Salto de línea final.
echo hello | sha256sumcalcula el hash dehelloseguido de un salto de línea. El cuadro de texto de aquí calcula el hash exactamente de lo que escribes, así que los resultados difieren salvo que añadas una línea nueva al final. En la línea de comandos,echo -noprintfevitan el carácter extra. - Finales de línea. Windows usa CR LF; Linux y macOS usan LF. Un texto de varias líneas pegado puede cambiar de final según de dónde venga.
- Codificación. El texto se convierte a UTF-8 antes de calcular el hash. Un sistema que calcule el hash de bytes en Latin-1 o UTF-16 obtendrá un resultado distinto para todo lo que vaya más allá del ASCII básico.
- Caracteres invisibles. Los espacios de no separación y los caracteres de ancho cero copiados de páginas web o PDF se ven idénticos en pantalla.
- Mayúsculas en hexadecimal. Los resúmenes se muestran en minúsculas.
A3F…ya3f…son el mismo valor; compáralos sin distinguir mayúsculas.
Hash de archivos y verificación de sumas
Hash de un archivo… lee el archivo elegido de forma local y calcula los cinco resúmenes a partir de sus bytes exactos. El nombre y la fecha del archivo no afectan al resultado, solo el contenido. La familia SHA usa la implementación Web Crypto integrada en el navegador; MD5 se calcula con una pequeña biblioteca de JavaScript porque los navegadores no lo incluyen.
Para verificar una descarga, abre la página de sumas de verificación del editor, busca la línea de tu archivo y compárala con la fila correspondiente de aquí. Comparar los primeros y los últimos seis u ocho caracteres es una comprobación rápida; para una seguridad real, compara la cadena completa. Si los valores no coinciden, vuelve a descargar el archivo antes de suponer una manipulación, porque una descarga interrumpida es el motivo más probable.
El archivo entero se carga en memoria antes de calcular el hash, así que los archivos muy grandes, sobre todo de varios gigabytes en un móvil, pueden ir lentos o fallar. No se sube nada.
Lo que no es un hash
Un hash sin más no es una forma de guardar contraseñas. MD5 y la familia SHA están diseñados para ser rápidos, lo que permite a los atacantes probar miles de millones de intentos por segundo contra un resumen filtrado. Guardar contraseñas exige una función deliberadamente lenta con sal, como bcrypt, scrypt o Argon2. Si lo que necesitas es simplemente un secreto robusto, usa el generador de contraseñas.
Un hash tampoco es cifrado. Funciona en un solo sentido: no hay ninguna clave para recuperar el original.