Seguridad

Introducción al hash

Entender el hash: propiedades de una función criptográfica, diferencia con el cifrado y la codificación, comandos sha256sum y Get-FileHash, y hash de contraseñas.

· 15 min de lectura · nivel principiante

El hash es el proceso de convertir un valor dado en otro valor. Se utiliza una función de hash para generar el nuevo valor según un algoritmo matemático. El resultado de una función de hash se conoce con el nombre de valor de hash o, simplemente, un hash.

Las buenas funciones de hash utilizan generalmente un algoritmo de hash unidireccional: dicho de otro modo, el hash no puede reconvertirse en el valor de origen.

Lo que produce una función de hash

Una función de hash acepta como entrada un dato de tamaño cualquiera —una palabra, una contraseña, un archivo de varios gigabytes— y produce como salida una serie de bits de longitud fija. Esta salida recibe varios nombres según los documentos: hash, huella, resumen o digest en inglés. Su longitud depende del algoritmo elegido, nunca del tamaño de la entrada.

SHA-256 (Secure Hash Algorithm, variante que produce 256 bits) produce siempre 256 bits, es decir, 32 bytes. Estos 32 bytes se muestran casi siempre en hexadecimal, una notación que representa cada byte con dos caracteres tomados de entre 0 a 9 y a a f. Una huella SHA-256 se presenta, por tanto, como una cadena de 64 caracteres.

$ printf 'bonjour' | sha256sum
2cb4b1431b84ec15d35ed83bb927e27e8967d75f4bcd9cc4b25c8d879ae23e18  -

$ printf 'Bonjour' | sha256sum
9172e8eec99f144f72eca9a568759580edadb2cfd154857f07e657569493bc44  -

Estos dos comandos se reproducen tal cual en cualquier sistema Linux que disponga del comando sha256sum, lo que ocurre en las distribuciones habituales. Se emplea el comando printf en lugar de echo porque no añade un salto de línea: ese carácter adicional formaría parte del dato al que se aplica el hash y cambiaría por completo el resultado. El guion al final de la salida indica que el dato procedía de la entrada estándar y no de un archivo.

Dos observaciones caben en este ejemplo. La primera: la misma entrada dará indefinidamente la misma salida, tanto en esta máquina como en otra. La segunda: el paso de una minúscula a una mayúscula, es decir, un solo bit de diferencia en el primer byte, produce una huella sin ninguna relación visible con la anterior.

Las cuatro propiedades esperadas de una función de hash criptográfica

No toda función que reduce un dato a un valor corto es criptográfica. Un CRC32 (Cyclic Redundancy Check de 32 bits) detecta muy bien un error de transmisión, pero fabricar voluntariamente dos archivos con el mismo CRC32 está al alcance de un ordenador portátil. El calificativo «criptográfica» supone cuatro propiedades.

El determinismo

La misma entrada produce siempre la misma huella. Es lo que permite comparar dos huellas para concluir que dos datos son idénticos. Cuidado con lo que realmente se somete al hash: son bytes, no un sentido. Un texto acentuado codificado en UTF-8 y el mismo texto codificado en ISO-8859-1 dan dos huellas diferentes; un archivo de texto guardado con finales de línea de Windows (retorno de carro y luego salto de línea) difiere del mismo archivo con finales de línea de Unix. Una huella que no coincide se explica muy a menudo así.

La resistencia a la preimagen

Dada una huella, debe ser inviable encontrar un dato que la produzca. Es la propiedad que la introducción llama el carácter unidireccional. No existe una operación inversa: la única vía conocida es probar entradas hasta reencontrar la huella, lo que representa del orden de 2256 tentativas para SHA-256.

Esta garantía tiene un límite que los principiantes subestiman: recae sobre la función, no sobre el dato. Si la entrada pertenece a un conjunto pequeño o previsible —una fecha de nacimiento, un número de teléfono, una dirección de correo, una contraseña común— el atacante no necesita romper nada. Enumera los candidatos, les aplica el hash y compara. Aplicar un hash a un dato adivinable no lo protege.

Una variante de esta propiedad es la resistencia a la segunda preimagen: a partir de un dato conocido, debe ser inviable construir otro, diferente, que produzca la misma huella.

La resistencia a las colisiones

Una colisión es un par de dos entradas diferentes que tienen la misma huella. Las colisiones existen necesariamente: las entradas posibles son en número ilimitado, las salidas son en número finito. La propiedad no exige, por tanto, que no existan, sino que no se sepa fabricarlas.

El coste de búsqueda de una colisión es netamente inferior al de una preimagen, a causa de lo que se llama la paradoja del cumpleaños: para una huella de n bits, hacen falta del orden de 2n/2 intentos. Para SHA-256, la seguridad real contra las colisiones es, por tanto, del orden de 2128, y no de 2256. Es este límite, la mitad de pequeño, el que explica por qué se abandonaron las huellas demasiado cortas.

El efecto avalancha

Modificar un solo bit de la entrada debe cambiar aproximadamente la mitad de los bits de la salida, sin regularidad explotable. El ejemplo de bonjour y Bonjour anterior lo muestra. La consecuencia práctica es importante: no se puede deducir nada del parecido entre dos huellas. Dos archivos casi idénticos tienen huellas totalmente distintas. La comparación de huellas es una respuesta de todo o nada, nunca una medida de proximidad.

Hash, cifrado, codificación: tres operaciones distintas

Es la confusión más frecuente al inicio del aprendizaje, y tiene consecuencias reales sobre la seguridad de una aplicación. Las tres operaciones transforman un dato en otra serie de caracteres, pero no sirven para el mismo uso ni ofrecen las mismas garantías.

  • La codificación cambia la representación de un dato. Es reversible por cualquiera, sin secreto, y ese es su fin. Base64, por ejemplo, representa bytes cualesquiera con ayuda de 64 caracteres imprimibles, para hacerlos pasar por un correo electrónico o un documento JSON. La codificación no aporta ninguna confidencialidad.
  • El cifrado vuelve un dato ilegible para quien no posee la clave, y perfectamente legible para quien la posee. Es reversible en ambos sentidos, por diseño. AES (Advanced Encryption Standard) y ChaCha20 son algoritmos de cifrado.
  • El hash no es reversible por nadie, ni siquiera por quien ha calculado la huella. No hay clave y no hay descifrado. La salida tiene un tamaño fijo, independiente de la entrada.
$ printf 'bonjour' | base64
Ym9uam91cg==

$ echo 'Ym9uam91cg==' | base64 -d
bonjour

Dos formulaciones habituales deben, por tanto, descartarse. «Contraseña encriptada» no describe nada utilizable: si una contraseña puede recuperarse, es que ha sido cifrada y que la clave está almacenada en algún sitio, lo que reduce el problema al almacenamiento de la clave. Y una contraseña codificada en Base64 es una contraseña en claro, simplemente menos legible a la vista.

Calcular una huella en Linux y en Windows

En Linux

$ printf 'bonjour\n' > exemple.txt

$ sha256sum exemple.txt
9cec0af545144159bac85c7b908d5e0b9b0ef961497401c5ad8da26f065ad926  exemple.txt

$ md5sum exemple.txt
94baaad4d1347ec6e15ae35c88ee8bc8  exemple.txt

$ openssl dgst -sha256 exemple.txt
SHA2-256(exemple.txt)= 9cec0af545144159bac85c7b908d5e0b9b0ef961497401c5ad8da26f065ad926

El paquete GNU coreutils, presente en la casi totalidad de las distribuciones —los sistemas construidos sobre BusyBox, como Alpine, solo proporcionan un equivalente restringido—, ofrece sha256sum, sha512sum, sha1sum, md5sum y b2sum. El comando openssl dgst cubre más algoritmos, por ejemplo openssl dgst -sha3-256. El rótulo que imprime depende de la versión instalada: las versiones recientes escriben SHA2-256(...) donde las antiguas escribían SHA256(...). La lista de los algoritmos realmente disponibles en la máquina se obtiene con openssl dgst -list.

En Windows

PS> Get-FileHash .\exemple.txt

Algorithm  Hash                                                              Path
---------  ----                                                              ----
SHA256     9CEC0AF545144159BAC85C7B908D5E0B9B0EF961497401C5AD8DA26F065AD926  C:\...\exemple.txt

PS> Get-FileHash .\exemple.txt -Algorithm MD5

El comando de PowerShell Get-FileHash utiliza SHA-256 por defecto; el parámetro -Algorithm acepta en particular SHA1, SHA256, SHA384, SHA512 y MD5. Su salida está en mayúsculas mientras que sha256sum escribe en minúsculas: es el mismo valor, la comparación simplemente debe ignorar las mayúsculas y minúsculas. Existe también una variante en línea de comandos clásica con certutil -hashfile exemple.txt SHA256.

Una observación de método: comparar 64 caracteres hexadecimales a ojo, o mirando solamente el principio y el final, no constituye una verificación. La comparación debe hacerla la máquina, como en la sección siguiente.

Para qué sirve realmente el hash

Verificar una descarga

Los editores publican, junto a sus archivos, un archivo de huellas, a menudo llamado SHA256SUMS, que contiene una línea por archivo. El comando sha256sum sabe releer este formato y hacer la comparación por sí mismo, con la opción -c.

$ sha256sum exemple.txt > SHA256SUMS

$ sha256sum -c SHA256SUMS
exemple.txt: Réussi

La palabra mostrada depende del idioma del sistema: un sistema configurado en inglés imprime OK. En caso de diferencia, el comando señala el fallo y devuelve un código de retorno distinto de cero, lo que permite emplearlo en un script.

El alcance de esta verificación merece comprenderse. Prueba que el archivo recibido es efectivamente aquel cuya huella se ha publicado. Protege, por tanto, contra una corrupción accidental: transferencia interrumpida, réplica defectuosa, soporte dañado. Frente a un adversario que controla el servidor, no basta: quien puede reemplazar el archivo puede generalmente reemplazar también la página que muestra la huella. Por eso los proyectos serios publican una firma electrónica del archivo de huellas, verificable con una clave pública obtenida por otro canal.

Identificar un archivo por su contenido

Una huella constituye un identificador de contenido: al no conocerse ninguna colisión para SHA-256, se concluye en la práctica que dos archivos de nombres diferentes que tengan la misma huella SHA-256 tienen el mismo contenido. Esta propiedad la utiliza el gestor de versiones Git, que nombra sus objetos internos por su huella, los sistemas de copia de seguridad que evitan almacenar dos veces un bloque idéntico, y las bases de huellas de software malicioso.

Firmar un documento

Una firma electrónica no recae sobre el documento en sí, sino sobre su huella: esta es corta, de tamaño fijo y rápida de calcular, mientras que las operaciones de firma son costosas. Esta construcción explica por qué la resistencia a las colisiones no es una preocupación teórica: si un atacante sabe fabricar dos documentos con la misma huella, hace firmar el primero y presenta el segundo con la misma firma válida.

Autenticar un mensaje

Un HMAC (keyed-Hash Message Authentication Code, código de autenticación de mensaje con clave) combina una función de hash y una clave secreta para producir un valor que prueba a la vez la integridad del mensaje y el conocimiento de la clave. No hay que improvisar esta construcción concatenando simplemente la clave y el mensaje: SHA-256 y SHA-512, construidas sobre el esquema llamado de Merkle-Damgård, son susceptibles a la extensión de longitud (las variantes truncadas de la misma familia, como SHA-384, se libran de ella), que permite a un tercero alargar el mensaje y recalcular una huella válida sin conocer la clave. HMAC está precisamente diseñado para impedirlo. SHA-3 y BLAKE2 no presentan esta debilidad.

El estado de los algoritmos en la práctica

MD5 (Message-Digest Algorithm 5, 128 bits) está roto en cuanto a la resistencia a las colisiones: la fabricación de dos entradas con la misma huella se demostró en 2004 y hoy se calcula en unos segundos en una máquina corriente. MD5 no debe seguir sirviendo en cuanto un adversario pueda influir en el contenido al que se aplica el hash: firma, control de integridad de una actualización, identificación de archivo en un contexto de seguridad.

SHA-1 (160 bits) ha seguido el mismo camino: una colisión completa se publicó en 2017 con el nombre de SHAttered, en forma de dos archivos PDF diferentes con la misma huella, y luego una colisión con prefijos elegidos en 2020, todavía más próxima a los escenarios de suplantación reales. SHA-1 se ha retirado de los certificados de las autoridades de certificación públicas y se ha proscrito para las nuevas firmas; todavía subsiste en sistemas antiguos.

Una precisión que evita un contrasentido: en ambos casos, lo que ha caído es la resistencia a las colisiones, no la resistencia a la preimagen. Recuperar un dato a partir de una huella MD5 sigue estando fuera de alcance por el cálculo directo —lo que no impide recuperarlo por enumeración cuando el dato es adivinable, como se explicó más arriba—. Este matiz no excusa el uso de MD5; simplemente explica lo que está roto y lo que no lo está.

Tres familias se emplean sin ninguna reserva publicada hasta la fecha (estado de los trabajos conocidos en el momento de la redacción, en 2026). SHA-2 agrupa en particular SHA-224, SHA-256, SHA-384 y SHA-512, no se conoce ninguna colisión en ella y SHA-256 constituye la opción por defecto razonable para la integridad. SHA-3, procedente del algoritmo Keccak y normalizado en 2015, se apoya en una construcción diferente, llamada en esponja; no está destinado a reemplazar a SHA-2, sino a ofrecer una solución de repuesto que no compartiría sus eventuales debilidades. BLAKE2 y BLAKE3 son rápidos en software y se encuentran sobre todo en las herramientas de copia de seguridad y de deduplicación; el comando b2sum disponible en Linux calcula un BLAKE2b de 512 bits por defecto.

El caso particular de las contraseñas

Por qué un SHA-256 desnudo no sirve

Una contraseña nunca se almacena en claro. Se almacena una huella, y en cada conexión se recalcula la huella de la contraseña introducida para compararla con la registrada. El reflejo del principiante es utilizar SHA-256. Conduce a una base de datos que se abre en unas horas.

La razón reside en una cualidad de SHA-256 convertida aquí en un defecto: su rapidez. Una tarjeta gráfica de videojuegos calcula varios miles de millones de huellas SHA-256 por segundo —orden de magnitud constatado en 2026, al alza en cada generación de hardware—. Como las contraseñas realmente elegidas por los usuarios se concentran en un conjunto restringido de candidatos, recorrer listas de varios cientos de millones de contraseñas ya divulgadas es inmediato. A ello se añade el efecto del determinismo: dos cuentas que tienen la misma contraseña presentan la misma huella, lo que se lee directamente en la base y señala las contraseñas más extendidas. Por último, unas tablas arcoíris, que conservan de forma condensada cadenas de cálculos efectuados de antemano, permiten recuperar una contraseña cambiando almacenamiento por tiempo de cálculo, sin rehacer el ataque desde cero.

La sal

La sal es un valor aleatorio, diferente para cada cuenta, sorteado en el momento del registro. No es secreta y se guarda junto a la huella, en la misma base. La función de hash se aplica a la combinación de la sal y la contraseña. De ello se derivan dos efectos: las tablas precalculadas se vuelven inutilizables, ya que haría falta una por cada sal; y dos cuentas que comparten la misma contraseña reciben huellas diferentes, lo que suprime la lectura directa mencionada antes. La sal, en cambio, no ralentiza el ataque de una cuenta única y concreta.

La pimienta

La pimienta es un valor secreto, idéntico para toda la aplicación, mezclado también con la contraseña antes del hash, pero que no se almacena en la base de datos: reside en la configuración del servidor de aplicaciones, o incluso en un módulo de seguridad hardware. Si solo se filtra la base —caso frecuente de una inyección SQL— el atacante no dispone del elemento necesario para probar sus candidatos. La contrapartida es operativa: cambiar la pimienta invalida todas las huellas existentes, y hay que prever cómo rotarla. La pimienta es una defensa adicional, nunca un reemplazo de la sal ni de una función adaptada.

Las funciones dedicadas

La buena respuesta al problema de la rapidez no es apañar repeticiones de SHA-256, sino emplear una función concebida para el almacenamiento de contraseñas, cuyo coste de cálculo es ajustable.

  • bcrypt, derivado del algoritmo de cifrado Blowfish, se ajusta mediante un factor de coste que duplica el tiempo de cálculo en cada incremento. Particularidad que conviene conocer: solo tiene en cuenta los 72 primeros bytes de la entrada.
  • scrypt se concibió para ser costoso en memoria tanto como en tiempo de cálculo, con el fin de dificultar los ataques llevados a cabo en tarjetas gráficas o en circuitos especializados, cuya memoria es el recurso escaso.
  • Argon2 ganó la Password Hashing Competition en 2015. Existe en tres variantes, Argon2d, Argon2i y Argon2id; es Argon2id la recomendada por defecto. Se ajustan tres parámetros: la memoria utilizada, el número de pasadas y el grado de paralelismo.
  • PBKDF2 (Password-Based Key Derivation Function 2) es más antiguo y se apoya en la repetición de una función pseudoaleatoria con clave, en la práctica HMAC. Resiste peor al hardware especializado que los anteriores, pero sigue siendo impuesto por ciertos marcos de conformidad.

El ajuste de los parámetros depende del hardware y de la carga: no existe un valor universal, y las cifras copiadas de un artículo envejecen mal. La regla practicable consiste en medir en el servidor previsto y retener el coste más elevado que la aplicación soporte en el pico de conexiones, y luego reevaluar esta medida periódicamente. Dos puntos valen para todas estas funciones: utilizar la implementación proporcionada por la biblioteca estándar del lenguaje en lugar de escribir una propia, y comparar las huellas con una función de comparación en tiempo constante, para que la duración de la respuesta no informe al atacante.

Puntos de atención y continuación del recorrido

Los comandos que hay que retener para un uso cotidiano caben en unas líneas: sha256sum fichier y sha256sum -c SHA256SUMS en Linux, Get-FileHash chemin en Windows, openssl dgst -sha256 fichier cuando es necesario un algoritmo menos común.

  • Una huella no es un secreto: protege la integridad, nunca la confidencialidad. Publicar la huella de un dato sensible equivale a menudo a publicar el dato si este es adivinable.
  • Una huella se verifica por comparación automática, no mirando los primeros y los últimos caracteres.
  • Una huella diferente de la esperada no indica siempre un ataque: la codificación del texto, los finales de línea, un archivo comparado con su contenido descomprimido son las causas más frecuentes.
  • Un archivo de huellas sin firmar solo demuestra la ausencia de corrupción accidental.
  • MD5 y SHA-1 deben descartarse en cuanto un adversario pueda elegir el contenido al que se aplica el hash; SHA-256 es la opción por defecto para la integridad.
  • Para una contraseña, ninguna función rápida sirve: Argon2id, scrypt o bcrypt, con una sal única por cuenta.

La continuación natural de este recorrido versa sobre tres temas que se apoyan todos en el hash: la firma electrónica y la verificación de una clave pública, los códigos de autenticación de mensaje de tipo HMAC y los tokens que de ellos se derivan, y las funciones de derivación de clave, que transforman una contraseña en clave de cifrado.

El texto original de este artículo no se conservó en los archivos de la web: la captura de la página se detiene antes del cuerpo. Solo subsiste su introducción, recogida aquí como apertura. El resto se reescribió el 9 de septiembre de 2026, y luego se revisó y corrigió punto por punto.