Hashing vs cifrado vs codificación: cuál es la diferencia
Hashing, cifrado y codificación suenan intercambiables y se mezclan todo el tiempo, pero resuelven tres problemas completamente distintos. Confundirlos provoca fallos de seguridad reales — como 'cifrar' una contraseña que debería hashearse, o tratar el Base64 como si fuera secreto. Esta guía traza las líneas con claridad para que siempre elijas el correcto.
Codificación: hacer los datos seguros para transportar
La codificación transforma los datos a otro formato para que puedan viajar por un sistema que espera una forma concreta. Base64, la codificación por porcentaje de URL y las entidades HTML son todas codificaciones. No hay clave ni secreto: cualquiera puede revertir una codificación, y ese es justamente el objetivo — el receptor necesita decodificarla.
Usa la codificación cuando la meta es la compatibilidad, no el secreto: poner binario en un campo JSON, llevar un valor con seguridad en una URL o incrustar una imagen como URI data:. Si alguna vez piensas en una codificación como algo que 'protege' los datos, esa es la señal de alarma de que has elegido la herramienta equivocada.
Cifrado: mantener los datos secretos pero recuperables
El cifrado revuelve los datos con una clave para que solo quien tenga la clave correcta pueda devolverlos al original. Es bidireccional por diseño — cifrar con la clave, descifrar con la clave (o su par). La seguridad recae por completo en mantener la clave secreta, no en ocultar el algoritmo.
Usa el cifrado cuando necesitas almacenar o enviar algo privado que después debe poder leerse: un mensaje en tránsito (HTTPS), archivos en reposo o una columna de base de datos con datos personales sensibles. El rasgo definitorio es la recuperabilidad: por diseño, el original puede recuperarse — por quien tenga la clave.
Hashing: una huella unidireccional
El hashing pasa los datos por una función unidireccional que produce un resumen de longitud fija. La misma entrada da siempre el mismo hash, pero no hay clave ni vuelta atrás — no puedes derivar la entrada a partir de la salida. Un buen hash criptográfico también hace inviable encontrar dos entradas con el mismo resumen.
Usa el hashing para verificar, no para recuperar: comprobar que una descarga no ha sido manipulada, comparar dos archivos o de-duplicar contenido. Como es irreversible, el hashing es justo lo que quieres cuando nunca necesitas el original de vuelta — solo confirmar si algo coincide con él.
El ejemplo de la contraseña que lo une todo
Las contraseñas son donde los tres chocan y donde los errores son más dañinos. Nunca debes cifrar una contraseña almacenada, porque el cifrado es reversible — cualquiera que robe la clave obtiene todas las contraseñas. En su lugar la hasheas, de modo que una brecha solo revele resúmenes, no las contraseñas.
Pero un simple hash SHA-256 es demasiado rápido: un atacante puede probar miles de millones de intentos por segundo. Por eso el hashing de contraseñas usa un algoritmo deliberadamente lento y con sal, como bcrypt, scrypt o Argon2. La sal hace que contraseñas idénticas se hasheen distinto, y la lentitud encarece el adivinado masivo. La codificación no pinta nada aquí.
Una guía rápida de decisión
Cuando no estés seguro de cuál necesitas, pregúntate qué intentas lograr y elige en consecuencia.
- ¿Necesitas enviar/almacenar datos y leer el valor exacto después, de forma privada? Cifrado.
- ¿Solo necesitas comprobar si los datos coinciden, nunca recuperarlos? Hashing — y para contraseñas, un hash lento con sal (bcrypt/Argon2).
- ¿Necesitas mover datos intactos por un canal solo de texto o solo de URL? Codificación (Base64, codificación de URL) — nunca para secreto.
- ¿Necesitas probar que un mensaje vino de alguien con una clave compartida? Un HMAC, que combina un hash con una clave secreta.