Cifrado y comunicación segura

Función hash (Hash Function)

Se lee en aproximadamente 5 minutos

Qué es una función hash

Una función hash convierte datos de cualquier longitud en un valor de longitud fija (hash o digest). La misma entrada siempre produce el mismo hash, pero es computacionalmente imposible recuperar los datos originales. Esta propiedad se llama "unidireccionalidad".

Por ejemplo, SHA-256 de hello produce 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824. Si cambia un solo carácter, el hash cambia completamente (efecto avalancha).

Las funciones hash difieren del cifrado: el cifrado es reversible con una clave, el hash es irreversible. Esta diferencia es la razón por la que se eligen funciones hash para almacenamiento de contraseñas y detección de alteraciones.

Comparación de algoritmos principales

MD5 (128 bits)
Diseñado en 1991. Rápido pero con resistencia a colisiones comprometida. Prohibido para seguridad. Solo útil como checksum de archivos.
SHA-1 (160 bits)
Ataque teórico en 2005, colisión real demostrada por Google en 2017 (SHAttered). No recomendado para nuevos usos.
SHA-256 (256 bits)
Familia SHA-2. Sin ataques de colisión conocidos. Usado en certificados TLS, blockchain y verificación de archivos. Elección estándar actual.
bcrypt
Diseñado para contraseñas. Tiene "factor de coste" que lo hace intencionalmente lento, resistente a ataques por GPU. Incluye salt automáticamente.

Para verificación general: SHA-256. Para contraseñas: bcrypt o Argon2. No usar MD5 ni SHA-1 para seguridad.

Rol en almacenamiento de contraseñas

Los servicios web nunca deben almacenar contraseñas en texto plano. Si la base de datos se filtra, todas las contraseñas quedarían expuestas.

El método correcto es almacenar el hash. Al iniciar sesión, se hashea la contraseña ingresada y se compara con el hash almacenado. El servidor nunca necesita conocer la contraseña original.

Sin embargo, el hash simple es insuficiente: la misma contraseña produce el mismo hash, permitiendo ataques con tablas precalculadas (rainbow tables) que mapean contraseñas comunes a sus hashes.

La contramedida es el "salt": un valor aleatorio único por contraseña que se concatena antes del hash. Misma contraseña con diferente salt produce diferente hash, invalidando las rainbow tables. bcrypt y Argon2 generan y aplican el salt automáticamente.

Uso en blockchain

Blockchain aprovecha las propiedades del hash. Cada bloque contiene el hash del bloque anterior, formando una cadena.

Si se alteran datos de un bloque, su hash cambia y no coincide con el registrado en el siguiente bloque. Alterar un bloque requiere recalcular todos los posteriores, lo cual es prácticamente imposible sin superar la capacidad computacional de toda la red.

En el minado de Bitcoin (Proof of Work), se compite por encontrar una entrada cuyo hash SHA-256 cumpla ciertas condiciones (cierta cantidad de ceros al inicio). La unidireccionalidad del hash obliga a probar por fuerza bruta, y este coste computacional sustenta la seguridad del blockchain.

Ataques rainbow table y salt

El ataque rainbow table precalcula hashes de contraseñas comunes y los compara con hashes filtrados para identificar las contraseñas originales.

  • Salt: Valor aleatorio añadido a cada contraseña antes del hash. Misma contraseña con diferente salt = diferente hash. Invalida tablas precalculadas.
  • Pepper: Valor secreto común a toda la aplicación, añadido además del salt. Si la BD se filtra pero el pepper está en otro lugar, la decodificación se dificulta aún más.
  • Stretching: Repetir el hash miles de veces, aumentando intencionalmente el tiempo por cálculo. El factor de coste de bcrypt y las iteraciones de PBKDF2 son ejemplos.

Usar un gestor de contraseñas para generar contraseñas largas y aleatorias hace extremadamente improbable que aparezcan en rainbow tables. Contra fuerza bruta, la longitud y complejidad son la mejor defensa.

Conceptos erróneos comunes

Hash y cifrado son lo mismo
El cifrado es reversible con una clave; el hash es irreversible. Para contraseñas se usa hash; para proteger comunicaciones, cifrado. Es importante distinguir según el uso.
Con SHA-256 las contraseñas están seguras
SHA-256 es excelente como hash general pero inadecuado para contraseñas: es demasiado rápido, permitiendo miles de millones de intentos por segundo con GPU. Para contraseñas se deben usar bcrypt o Argon2, intencionalmente lentos.
Compartir

Términos relacionados

Artículos relacionados