Tema 13
Las funciones hash criptográficas no cifran datos ni usan necesariamente una clave, pero son una pieza esencial de la seguridad moderna. Permiten resumir información de forma determinística y compacta, y a partir de esa capacidad sostienen integridad, firmas digitales, autenticación y protección de contraseñas.
En seguridad es muy común querer responder preguntas como estas: ¿un archivo cambió?, ¿un mensaje fue alterado?, ¿dos contenidos son exactamente iguales?, ¿cómo verificar un documento sin procesarlo completo todo el tiempo? Las funciones hash criptográficas ofrecen una herramienta poderosa para abordar este tipo de problemas.
Su rol no es ocultar datos como el cifrado ni establecer identidad por sí solas como una firma completa. Su función es condensar información en una huella digital de tamaño fijo que reacciona de forma muy sensible a cualquier cambio en la entrada.
Una función hash criptográfica toma una entrada de tamaño arbitrario y produce una salida de longitud fija, llamada hash, digest o resumen. Esa salida actúa como una representación compacta del contenido original.
Por ejemplo, un archivo de unos pocos bytes y un video de varios gigabytes pueden procesarse por la misma función hash y ambos producirán una salida del mismo tamaño, aunque obviamente distinta si el contenido es diferente.
No toda función hash es criptográfica. Existen funciones hash usadas para tablas hash, índices o estructuras de datos que son rápidas y prácticas, pero no están diseñadas para resistir ataques. Una función hash criptográfica debe cumplir propiedades más fuertes relacionadas con integridad y resistencia a manipulación.
Su objetivo no es solo resumir datos eficientemente, sino hacerlo de una manera que sea robusta frente a adversarios que intentan construir entradas engañosas o explotar colisiones.
Una propiedad básica es el determinismo. Si procesamos exactamente la misma entrada con la misma función hash, el resultado siempre debe ser el mismo. Esto parece obvio, pero es fundamental porque permite comparar y verificar contenidos de forma consistente.
Sin determinismo, el hash no serviría como huella confiable del contenido.
Otra propiedad importante es que la salida tiene longitud fija. Esto hace que el resumen sea manejable y comparable sin importar cuánto mida la entrada original. Un hash de 256 bits, por ejemplo, siempre tendrá ese tamaño, independientemente del tamaño del archivo o mensaje procesado.
Esta característica es una de las razones por las que los hashes son tan útiles en integridad, índices, firmas y protocolos.
Una buena función hash criptográfica debe presentar efecto avalancha: un cambio mínimo en la entrada, como modificar un solo bit, debe producir una salida completamente diferente y sin relación visible con la anterior.
Esto evita que pequeños cambios queden reflejados de forma demasiado predecible y refuerza la sensibilidad del resumen frente a cualquier alteración.
Una de las propiedades fundamentales es la resistencia a preimagen. Significa que, dado un hash h, debe ser computacionalmente inviable encontrar una entrada m tal que la función hash de m sea precisamente h.
En otras palabras, ver la huella no debería permitir reconstruir el contenido original. Esto ayuda a entender por qué un hash no es reversible como el cifrado.
Otra propiedad clave es la resistencia a segunda preimagen. Si ya tenemos una entrada m, debe ser muy difícil encontrar otra entrada diferente m' que produzca exactamente el mismo hash.
Esta propiedad importa especialmente cuando se quiere evitar que un atacante sustituya un contenido legítimo por otro distinto que conserve el mismo resumen.
La resistencia a colisiones significa que debe ser muy difícil encontrar dos entradas distintas cualesquiera que produzcan el mismo hash. A diferencia de la segunda preimagen, aquí el atacante puede elegir libremente ambas entradas.
Como el espacio de entradas posibles es mucho mayor que el espacio de salidas fijas, sabemos que colisiones matemáticamente existen. Lo importante es que encontrarlas sea computacionalmente impracticable.
Estos conceptos suelen confundirse, pero no son equivalentes:
Cada una representa un nivel distinto de dificultad y un tipo distinto de seguridad requerida.
Cuando hablamos de colisiones, aparece una idea importante de probabilidad: la paradoja del cumpleaños. En términos prácticos, muestra que encontrar colisiones puede requerir bastante menos esfuerzo del que intuitivamente se esperaría si solo miráramos el tamaño total del espacio de salida.
Por eso, para resistencia a colisiones, una función hash de n bits suele ofrecer una seguridad efectiva del orden de n/2 bits frente a ataques genéricos de cumpleaños.
Las funciones hash criptográficas aparecen en numerosos contextos:
Es fundamental insistir en una diferencia ya anticipada: un hash no cifra. El cifrado está pensado para ocultar información y luego recuperarla con una clave. El hash, en cambio, produce un resumen fijo que no está diseñado para revertirse.
Por eso decir que una contraseña está "encriptada" cuando en realidad está almacenada como hash es técnicamente incorrecto. Son mecanismos con objetivos distintos.
Un hash por sí solo no demuestra quién produjo el contenido. Cualquiera puede calcular el hash de un mensaje si la función es pública. Para obtener autenticidad o no repudio, el hash debe integrarse con una clave o con una firma digital.
Esto explica por qué los hashes suelen ser una pieza dentro de un mecanismo mayor y no una solución completa por sí mismos.
Uno de los usos más intuitivos del hashing es la verificación de integridad. Si un proveedor publica el hash de un archivo y luego el usuario calcula el hash de la copia descargada, ambos valores deberían coincidir si el archivo no fue alterado.
Este proceso no prueba quién generó el archivo ni protege por sí solo frente a un atacante que pueda reemplazar tanto el archivo como el hash publicado, pero sí sirve como control de consistencia e integridad cuando el canal de referencia es confiable.
En firmas digitales no se suele firmar el documento completo directamente con un algoritmo asimétrico pesado. Lo habitual es calcular primero el hash del documento y luego firmar ese hash. Esto mejora eficiencia y mantiene la sensibilidad a cualquier cambio en el contenido.
Si el documento cambia, su hash cambia, y la firma deja de verificar correctamente.
Las funciones hash también sirven como base para mecanismos de autenticación con clave, como HMAC. En ese caso, la función hash por sí sola no basta; se la combina con un secreto compartido para verificar tanto integridad como autenticidad del mensaje.
Más adelante estudiaremos HMAC con detalle, pero es importante anticipar que el hash es la pieza central de muchas construcciones de seguridad más complejas.
El tamaño del hash importa porque condiciona el costo de ataques genéricos. Cuanto más corta sea la salida, más fácil será en principio buscar colisiones o intentar ataques de preimagen. Por eso las funciones hash modernas suelen usar tamaños de salida suficientemente grandes para el nivel de seguridad buscado.
Elegir un algoritmo con salida demasiado pequeña puede dejar corto el margen de seguridad.
Una función hash deja de ser apropiada para fines criptográficos si aparecen ataques que reducen sustancialmente el costo de encontrar colisiones, segundas preimágenes o estructuras explotables. También puede volverse problemática si muestra comportamientos estadísticos débiles o propiedades no deseadas frente a construcciones reales.
Esto explica por qué algunos algoritmos históricamente populares dejaron de ser recomendables con el tiempo.
Las funciones hash criptográficas son una de las herramientas más versátiles y fundamentales de la seguridad digital. Aunque no cifran ni autentican por sí solas, permiten construir integridad, firmas, autenticación y protección de contraseñas sobre una base matemática compacta y eficiente.
En el próximo tema compararemos algoritmos concretos como MD5, SHA-1, SHA-2 y SHA-3, distinguiendo cuáles quedaron obsoletos y cuáles siguen siendo adecuados en la práctica moderna.