Criptografía en Desarrollo Web: Codificación, Encriptación y Hashing
Uno de los errores conceptuales más frecuentes en el desarrollo de software es utilizar indistintamente los términos "codificar", "encriptar" y "hashear". Como destaca Laurențiu Spilcă en sus fundamentos de Spring Security, cada uno de estos procesos responde a un propósito matemático y operacional radicalmente diferente:
1. Codificación (Encoding) — Transformación de Formato
- Definición: Es la conversión de una secuencia de datos de un formato a otro para garantizar la compatibilidad, transmisión y lectura entre sistemas informáticos heterogéneos.
- Mecanismo: Sigue un algoritmo público y estándar. No utiliza claves secretas.
- Reversibilidad: 100% Reversible. Cualquiera que conozca el estándar de codificación puede revertir el proceso de forma directa.
- Nivel de Confidencialidad: Cero (0). Codificar datos no protege su secreto ni previene que un atacante los lea.
- Ejemplos clásicos: Base64 (empleado para transportar binarios en texto plano o encabezados HTTP Basic), URL Encoding (
%20para espacios), ASCII, UTF-8.
Texto Plano: admin:123456
Base64 Encoded: YWRtaW46MTIzNDU2 <-- ¡Cualquiera puede decodificarlo al instante!
2. Encriptación (Encryption / Cifrado) — Confidencialidad con Clave Secreta
- Definición: Es una transformación criptográfica que convierte un mensaje legible (plaintext) en un texto ininteligible (ciphertext), gobernada obligatoriamente por una clave secreta (Secret Key).
- Mecanismo: Algoritmo matemático bidireccional diseñado para que únicamente quien posea la clave correspondiente pueda descifrar el mensaje.
- Reversibilidad: Reversible mediante clave. Posee dos operaciones inversas acopladas:
Encrypt(Mensaje, Clave) -> CifradoyDecrypt(Cifrado, Clave) -> Mensaje. - Tipos de Cifrado:
- Simétrico (Clave Secreta Compartida): Se utiliza la misma clave para cifrar y descifrar (ej. AES-256, ChaCha20). Altamente eficiente para cifrado en masa.
- Asimétrico (Clave Pública y Privada): Se cifra con una clave pública y solo se descifra con la clave privada asociada (ej. RSA, Curvas Elípticas ECC). Base de los certificados TLS/HTTPS y firmas digitales.
- Propósito: Proteger la confidencialidad de datos en tránsito (navegación web segura HTTPS) o datos confidenciales en reposo (números de tarjeta de crédito en bases de datos).
3. Funciones Hash (Hashing) — Resumen Unidireccional e Irreversible
- Definición: Es una operación matemática que toma una entrada de cualquier longitud (desde una sola letra hasta un archivo de gigabytes) y genera una cadena de salida alfanumérica de longitud fija (digest o huella digital).
- Mecanismo: Es una función trampa unidireccional (One-Way Function). Está matemáticamente diseñada para que sea computacionalmente inviable reconstruir el mensaje original a partir del hash resultante.
- Propiedades Fundamentales:
- Determinista: La misma entrada siempre genera exactamente el mismo hash.
- Irreversible (-X-): Dado el hash , no existe una fórmula matemática inversa que permita despejar .
- Efecto Avalancha (Avalanche Effect): Cambiar un solo bit en la entrada produce un hash completamente irreconocible y disímil.
- Resistencia a Colisiones: Es computacionalmente inviable encontrar dos entradas distintas que arrojen el mismo hash ().
Si encriptaras las contraseñas de tus usuarios con AES o RSA, existiría una clave de desencriptación. Si un atacante vulnera el servidor o un administrador deshonesto accede a la clave, podría desencriptar todas las contraseñas en texto plano.
Por esta razón, las contraseñas de los usuarios nunca se encriptan; siempre se hashean. Cuando un usuario inicia sesión, el sistema no "desencripta" la contraseña almacenada; en su lugar, toma la contraseña que el usuario escribió en el formulario, calcula su hash y compara si coincide con el hash almacenado en la base de datos mediante passwordEncoder.matches(raw, hash).
4. El Rol del Salt (Salado) y Algoritmos Lentos (BCrypt)
Los atacantes utilizan bases de datos gigantescas de hashes precalculados conocidas como Tablas Arcoíris (Rainbow Tables) para descubrir contraseñas comunes (ej. el hash SHA-256 de 123456 siempre es conocido).
Para neutralizar esto, Spring Security utiliza BCrypt, el cual implementa:
- Salt Criptográfico Aleatorio: Una secuencia de bytes aleatorios generada automáticamente que se concatena a la contraseña antes de aplicar el algoritmo. Esto garantiza que dos usuarios con la misma contraseña (
123456) tengan hashes completamente diferentes en la base de datos. - Factor de Costo Computacional (Work Factor): BCrypt es un algoritmo deliberadamente lento y configurable (por defecto rondas de hashing). Esto ralentiza drásticamente los ataques de fuerza bruta basados en hardware acelerado por GPUs.