En la era digital actual, la seguridad de la información es primordial. Nuestras vidas y negocios dependen de sistemas que almacenan datos sensibles, y entre los más críticos se encuentran las contraseñas de acceso. Guardar contraseñas en texto plano en una base de datos es un riesgo inaceptable que abre la puerta a brechas de seguridad catastróficas. Afortunadamente, existen técnicas robustas para proteger estas credenciales. La más fundamental y ampliamente utilizada es el hashing, a menudo referido incorrectamente como cifrado de contraseñas.

Cuando hablamos de proteger contraseñas en una base de datos, no solemos aplicar un cifrado tradicional (que permite reversible la información con una clave), sino un proceso unidireccional llamado hashing o función resumen. Este proceso transforma la contraseña original en una cadena de caracteres de longitud fija que parece aleatoria. Esta cadena es lo que realmente se almacena en la base de datos, nunca la contraseña original.
- ¿Por qué es Crucial No Guardar Contraseñas en Texto Plano?
- Entendiendo el Hashing de Contraseñas
- La Importancia del Salt (Sal)
- Técnicas Avanzadas: Key Stretching
- Hashing vs. Cifrado (Encriptación) en Bases de Datos
- Algoritmos de Hashing Históricos y Modernos
- El Caso de MySQL y el Hashing Histórico
- Por Qué las Contraseñas Fuertes Siguen Siendo Vitales
- Mejorando la Gestión de Contraseñas
- Preguntas Frecuentes
- Conclusión
¿Por qué es Crucial No Guardar Contraseñas en Texto Plano?
Imagina que un atacante logra acceder a tu base de datos, ya sea por una vulnerabilidad de software, una configuración errónea o credenciales débiles. Si las contraseñas estuvieran guardadas tal cual las escribimos, el atacante tendría acceso instantáneo a todas ellas. Esto no solo comprometería las cuentas dentro de ese sistema, sino que, dada la común práctica de reutilizar contraseñas, podría permitir al atacante acceder a otros servicios que el usuario utilice con la misma clave (un tipo de ataque conocido como credential stuffing).
Almacenar el hash de la contraseña en lugar de la contraseña original mitiga este riesgo significativamente. Si un atacante obtiene el hash, no puede (o al menos, no fácilmente) revertirlo para obtener la contraseña original. Solo tiene una representación de ella. Para acceder a una cuenta, necesitaría la contraseña real.
Entendiendo el Hashing de Contraseñas
El hashing es un proceso que utiliza una función matemática (llamada función de hash o función resumen) para convertir una entrada (la contraseña) en una salida de tamaño fijo (el hash o resumen). Las características clave de una buena función de hash para contraseñas son:
- Determinista: La misma entrada siempre produce la misma salida.
- Eficiente: Calcular el hash debe ser rápido.
- Resistente a colisiones: Es extremadamente difícil (idealmente imposible) encontrar dos entradas diferentes que produzcan el mismo hash.
- Irreversible: Es computacionalmente inviable derivar la entrada original a partir del hash. Esta es la característica más importante para la seguridad de contraseñas.
El proceso funciona así: Cuando creas una cuenta o cambias tu contraseña, la aplicación toma tu contraseña, aplica la función de hash y guarda el resultado (el hash) en la base de datos. Cuando intentas iniciar sesión, la aplicación toma la contraseña que ingresas, aplica *la misma* función de hash, y compara el nuevo hash generado con el hash almacenado en la base de datos para tu usuario. Si coinciden, la autenticación es exitosa. Si no, falla.
Ejemplo simplificado:
Contraseña original: MiClaveSegura123
Función de Hash (ej. SHA-256 simplificado)
Hash generado y almacenado: a1b2c3d4e5f67890... (una cadena mucho más larga y compleja)
Al iniciar sesión con MiClaveSegura123, el sistema calcula su hash (a1b2c3d4e5f67890...) y lo compara con el almacenado. Si coinciden, ¡adelante!
La Importancia del Salt (Sal)
Aunque el hashing es unidireccional, tiene una vulnerabilidad potencial: si dos usuarios usan la misma contraseña (por ejemplo, 123456), el hash generado será idéntico si se usa la misma función de hash. Un atacante podría precalcular hashes para contraseñas comunes (creando tablas arco iris o rainbow tables) y, si accede a los hashes de la base de datos, buscar coincidencias para descubrir las contraseñas originales.
Aquí es donde entra el salt. Un salt es una cadena de caracteres aleatoria y única que se genera para cada contraseña individual. Antes de aplicar la función de hash, el salt se añade a la contraseña. Lo que se hashea es la combinación de la contraseña y el salt.
Proceso con Salt:
- Usuario crea contraseña:
MiClave - Sistema genera un salt único para este usuario:
XYZ789 - Lo que se hashea es:
MiClaveXYZ789 - Hash generado y almacenado:
hash(MiClave + XYZ789) - El salt (
XYZ789) también se almacena en la base de datos, generalmente junto al hash.
Al iniciar sesión:
- Usuario ingresa contraseña:
MiClave - Sistema recupera el salt almacenado para este usuario:
XYZ789 - Sistema hashea:
hash(MiClave + XYZ789) - Compara el nuevo hash generado con el hash almacenado.
¿Por qué funciona esto? Porque incluso si dos usuarios usan la misma contraseña MiClave, si se les asigna un salt diferente (ej. XYZ789 para uno y ABC123 para otro), el valor que se hashea será distinto (MiClaveXYZ789 vs MiClaveABC123). Por lo tanto, los hashes almacenados serán completamente diferentes. Esto invalida las tablas arco iris y obliga a un atacante a calcular el hash para cada contraseña individualmente, usando el salt específico de cada usuario, lo cual es computacionalmente mucho más costoso.

Técnicas Avanzadas: Key Stretching
Incluso con hashing y salting, las funciones de hash rápidas (como SHA-256 o MD5, aunque MD5 ya no se considera seguro para contraseñas) aún podrían ser vulnerables a ataques de fuerza bruta, donde un atacante prueba millones o miles de millones de posibles contraseñas por segundo para encontrar una coincidencia de hash.
El key stretching (estiramiento de clave) o la derivación de clave (Key Derivation Function - KDF) es una técnica que hace que el proceso de hashing sea intencionadamente lento. En lugar de hashear la contraseña y el salt una sola vez, el proceso se repite miles o millones de veces. Esto aumenta significativamente el tiempo y el esfuerzo computacional necesario para calcular un hash, tanto para el sistema al autenticar (un pequeño retraso aceptable para un usuario) como para un atacante que intenta probar masivamente contraseñas (un retraso prohibitivo).
Algoritmos modernos diseñados específicamente para el hashing seguro de contraseñas, como bcrypt, scrypt y Argon2, incorporan automáticamente salting y key stretching. Son mucho más resistentes a los ataques de fuerza bruta y de tablas precalculadas que algoritmos de hashing de propósito general como SHA-256.
Hashing vs. Cifrado (Encriptación) en Bases de Datos
Es común confundir hashing con cifrado, pero para la protección de contraseñas almacenadas, la diferencia es clave:
| Característica | Hashing (Función Resumen) | Cifrado (Encriptación) |
|---|---|---|
| Dirección | Unidireccional (irreversible) | Bidireccional (reversible con clave) |
| Propósito Principal | Verificar integridad/Autenticación | Confidencialidad de datos |
| Clave | No usa clave para "descifrar", solo un algoritmo público | Usa clave secreta para cifrar/descifrar |
| Uso Típico en BD (Contraseñas) | Almacenamiento seguro (se guarda el hash, no el original) | No se usa para contraseñas (no queremos poder recuperarlas), sí para otros datos sensibles (ej. números de tarjeta) |
Para contraseñas, queremos un proceso unidireccional (hashing) porque nunca deberíamos necesitar la contraseña original de un usuario. Para datos como números de tarjetas de crédito o información personal, a menudo necesitamos poder recuperarlos, por lo que se usa cifrado bidireccional.
Algoritmos de Hashing Históricos y Modernos
A lo largo del tiempo, se han utilizado diferentes algoritmos para el hashing de contraseñas, con distintos niveles de seguridad:
- DES (Data Encryption Standard) / Triple DES: Históricos. DES (56 bits) fue rápidamente superado. Triple DES (usando DES tres veces con diferentes claves) ofreció más seguridad (112 o 168 bits) pero es lento y también se considera obsoleto para la mayoría de usos modernos, aunque aún se ve en algunos sistemas legados (como algunos sistemas bancarios antiguos). No son funciones de hash unidireccionales diseñadas para contraseñas, sino algoritmos de cifrado simétrico, pero se mencionan a veces en contextos históricos de protección de datos.
- MD5 / SHA-1: Funciones de hash de propósito general. Son rápidas, pero han demostrado ser vulnerables a ataques de colisión y son demasiado rápidas para ser seguras contra ataques de fuerza bruta en contraseñas, incluso con salting. No deben usarse para almacenar contraseñas hoy en día.
- SHA-256 / SHA-512: Parte de la familia SHA-2. Son funciones de hash criptográficas seguras para verificar la integridad de datos, pero, al igual que MD5/SHA-1, son demasiado rápidas para ser usadas solas en el hashing de contraseñas. Se usan a menudo *dentro* de algoritmos de key stretching.
- Blowfish: Es un algoritmo de cifrado simétrico. Sin embargo, su estructura fue la base para bcrypt, una de las primeras y aún respetadas funciones de derivación de clave para contraseñas, que incorpora salting y un factor de trabajo (costo) configurable para el key stretching.
- RSA: Es un algoritmo de cifrado asimétrico. Se usa para cifrar datos o firmas digitales, pero no es adecuado ni se usa para hashear contraseñas.
- bcrypt, scrypt, Argon2: Son los algoritmos recomendados actualmente para el hashing seguro de contraseñas. Están diseñados específicamente para ser lentos (resistentes a fuerza bruta) e incorporan salting de forma estándar. Argon2 es el ganador de la Password Hashing Competition (PHC) y se considera el más seguro actualmente.
El Caso de MySQL y el Hashing Histórico
Las propias bases de datos han evolucionado en cómo manejan el hashing de contraseñas. Por ejemplo, MySQL tuvo una evolución significativa en sus métodos de hashing. Originalmente, usaba un algoritmo de hashing más simple que producía hashes cortos (16 bytes). A partir de la versión 4.1, introdujo un algoritmo más seguro que producía hashes más largos (41 bytes), que incluían un asterisco inicial y tenían mejores propiedades criptográficas. Esta transición generó problemas de compatibilidad con clientes antiguos que solo entendían el formato de hash corto. Esto subraya la importancia de usar métodos de hashing modernos y mantener los sistemas actualizados para aprovechar las mejoras de seguridad.
Por Qué las Contraseñas Fuertes Siguen Siendo Vitales
Aunque el hashing, el salting y el key stretching protegen las contraseñas *almacenadas* de un acceso directo en caso de una brecha, no pueden proteger contra todo. Si un usuario elige una contraseña extremadamente débil (como password123 o 12345678), un atacante aún podría adivinarla mediante un ataque de diccionario o fuerza bruta, incluso si el hash está bien protegido. El atacante simplemente prueba contraseñas comunes, las hashea con el salt correcto y compara el resultado con el hash almacenado. Si la contraseña es muy común, la adivinará rápidamente.
Además, si reutilizas la misma contraseña fuerte en múltiples sitios, y uno de esos sitios sufre una brecha y los atacantes obtienen la combinación de usuario/hash (y salt), podrían usar esa misma contraseña para intentar acceder a tus cuentas en otros servicios. Si tienes suerte y esos otros servicios usan un hashing robusto, quizás necesiten hacer fuerza bruta sobre cada uno, pero si la contraseña es fuerte y la reutilizas, el riesgo de credential stuffing aumenta drásticamente.
La seguridad es una defensa en capas. El hashing robusto protege la base de datos, pero contraseñas únicas y fuertes son la primera línea de defensa del usuario.

Mejorando la Gestión de Contraseñas
Dado todo lo anterior, ¿qué puedes hacer para protegerte?
- Usa contraseñas fuertes y únicas: Una contraseña fuerte es larga (idealmente 12-16 caracteres o más), combina letras mayúsculas y minúsculas, números y símbolos. Lo más importante: que sea única para cada cuenta.
- Evita información personal: No uses nombres de familiares, mascotas, fechas de cumpleaños, etc., ya que son fáciles de adivinar o encontrar en redes sociales.
- Considera un gestor de contraseñas: Herramientas como gestores de contraseñas te ayudan a generar contraseñas complejas y únicas para cada sitio y almacenarlas de forma segura (generalmente cifradas). Solo necesitas recordar una contraseña maestra. Muchos también ofrecen funcionalidades de autocompletado y auditorías de seguridad.
- Habilita la autenticación multifactor (MFA): Siempre que sea posible, activa la MFA. Esto añade una capa extra de seguridad (ej. un código enviado a tu teléfono) incluso si tu contraseña se ve comprometida.
Preguntas Frecuentes
¿Es lo mismo cifrar que hashear una contraseña?
No. Cifrar (encriptar) es un proceso bidireccional que permite recuperar la información original usando una clave. Hashear es un proceso unidireccional irreversible, ideal para almacenar contraseñas de forma segura sin la posibilidad de recuperarlas en texto plano.
¿Por qué no se guarda la contraseña original si la base de datos está protegida?
Ninguna base de datos es 100% invulnerable a un ataque. Si un atacante logra acceder a los datos, guardar las contraseñas en texto plano las expone inmediatamente. Almacenar solo el hash (con salt y key stretching) minimiza el daño de una brecha, haciendo extremadamente difícil o imposible para el atacante obtener las contraseñas originales.
¿El salt hace que el hashing sea más seguro?
Sí, el salt no hace que el algoritmo de hashing sea intrínsecamente más fuerte, pero protege contra ataques basados en tablas precalculadas (rainbow tables) y asegura que usuarios con la misma contraseña tengan hashes distintos, lo que obliga a los atacantes a trabajar mucho más por cada contraseña.
¿Qué tan seguros son los hashes?
La seguridad de un hash depende del algoritmo utilizado, el uso de salt y, crucialmente para contraseñas, si se aplica key stretching. Algoritmos modernos como bcrypt o Argon2, usados correctamente con un salt único y un factor de trabajo (costo) alto, son muy resistentes a los ataques de fuerza bruta con la tecnología actual.
¿Qué es un ataque de fuerza bruta?
Es un método de ataque en el que un programa intenta todas las posibles combinaciones de caracteres para adivinar una contraseña (o una clave de cifrado). Los algoritmos de hashing lentos (con key stretching) hacen que este ataque sea computacionalmente prohibitivo para contraseñas bien elegidas.
¿Necesito un gestor de contraseñas si mis contraseñas están hasheadas en la base de datos?
Sí. El hashing protege la base de datos contra brechas directas. Un gestor de contraseñas te ayuda a usar contraseñas únicas y fuertes para cada servicio, protegiéndote contra ataques de credential stuffing (cuando una contraseña robada en un sitio se usa para acceder a otros) y facilitando la gestión de múltiples claves complejas.
Conclusión
La protección de contraseñas en bases de datos es un pilar fundamental de la seguridad informática. El uso de funciones de hashing criptográfico, combinado con técnicas esenciales como el salting para añadir unicidad y el key stretching para aumentar la resistencia a la fuerza bruta, crea una defensa robusta contra el acceso no autorizado a las credenciales almacenadas. Si bien la tecnología de hashing es crucial, no reemplaza la necesidad de que los usuarios creen contraseñas fuertes y únicas y practiquen una buena higiene de seguridad digital, idealmente apoyados por gestores de contraseñas y autenticación multifactor. La combinación de una implementación de hashing segura en la base de datos y hábitos de contraseña responsables por parte del usuario es la estrategia más efectiva para mantener las cuentas a salvo.
Si quieres conocer otros artículos parecidos a Protegiendo Claves: Cifrado en Bases de Datos puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL