1. Almacenamiento de contraseña (la forma correcta):
* Hashing: En lugar de almacenar la contraseña del usuario directamente, el sistema almacena un * hash * criptográfico de la contraseña. Un hash es una función unidireccional; Es fácil calcular el hash de la contraseña, pero prácticamente imposible de obtener la contraseña original del hash.
* Salting: Para mejorar aún más la seguridad, se agrega una * sal * aleatoria a la contraseña antes del hash. La sal es una cadena de caracteres única y generada al azar. Esto hace que sea mucho más difícil para los atacantes usar tablas de hash precomputadas (tablas de arco iris) para descifrar las contraseñas, incluso si obtienen acceso a la base de datos.
* La 'Salt' se almacena típicamente junto con la contraseña `Hash` en el registro del usuario.
* Algoritmos de hashing fuerte: Los sistemas modernos utilizan algoritmos de hash sólidos como:
* bcrypt: Algoritmo de hashing adaptativo que es lento y computacionalmente costoso, por lo que es muy resistente a los ataques de fuerza bruta. Incluye la generación de sal y el almacenamiento dentro del hash.
* argon2: Un algoritmo de hashing más moderno y de memoria, a menudo considerado el sucesor de Bcrypt.
* Scrypt: Otra función de derivación clave que está diseñada para ser computacionalmente intensiva, lo que hace que sea más difícil descifrar las contraseñas.
2. Proceso de inicio de sesión/autenticación:
1. Entrada del usuario: El usuario ingresa su nombre de usuario y contraseña en el formulario de inicio de sesión.
2. Recuperar sal: El sistema recupera el * sal * asociado con el nombre de usuario ingresado desde la base de datos del usuario.
3. Hashing con sal: El sistema toma la contraseña ingresada del usuario y la *sal *recuperada *, las combina y luego aplica el mismo algoritmo de hashing que se usó cuando la contraseña se almacenó originalmente.
4. Comparación: El hash resultante del paso 3 se compara con el hash de contraseña almacenada para ese usuario en la base de datos.
5. Verificación:
* Si los dos hashes coinciden: Es muy probable que el usuario ingresó la contraseña correcta. El usuario se autentica y se establece una sesión.
* Si los hashes no coinciden: La contraseña ingresada es incorrecta. Se le niega el acceso al usuario y generalmente recibe un mensaje de error.
Por qué esto es seguro:
* Sin contraseñas de texto sin formato: El sistema * nunca * almacena la contraseña real en texto sin formato, por lo que incluso si la base de datos se ve comprometida, los atacantes no tendrán acceso directo a las contraseñas.
* La sal previene los ataques de mesa del arco iris: La sal única para cada usuario hace que las tablas de arco iris (tablas de hash precomputadas) sean ineficaces. Un atacante necesitaría generar una mesa de arco iris para * cada * sal, que es computacionalmente prohibitiva.
* El hashing lento evita los ataques de fuerza bruta: Los algoritmos de hash modernos (como Bcrypt, Argon2 y Scrypt) están diseñados deliberadamente para ser lentos. Esto significa que un atacante no puede probar una gran cantidad de conjeturas de contraseña rápidamente.
Ejemplo de código (conceptual - python con bcrypt):
`` `Python
importar bcrypt
Def hash_password (contraseña):
"" "Hashes una contraseña usando bcrypt con una sal generada al azar". ""
# Generar una sal
sal =bcrypt.gensalt ()
# Hash la contraseña usando la sal
Hashed_password =bcrypt.hashpw (contraseña.encode ('utf-8'), sal)
return hashed_password, sal #return tanto el hash como la sal para que la sal se pueda almacenar con el hash
Def verify_password (Entered_password, Stored_hash, Stored_salt):
"" "Verifica si la contraseña ingresada coincide con el hash almacenado". ""
# Hash la contraseña ingresada con la sal almacenada
hashed_entered_password =bcrypt.hashpw (Entered_password.encode ('UTF-8'), Stored_salt)
# Compare el hash generado con el hash almacenado
return hashed_entered_password ==stored_hash
Uso de ejemplo (al crear un nuevo usuario):
contraseña ="mySecretPassword123"
hashed_password, sal =hash_password (contraseña)
Almacene el hashed_password y la sal en la base de datos (asociada con el usuario)
Uso de ejemplo (durante el inicio de sesión):
Entered_password ="mySecretPassword123" #User proporciona durante el inicio de sesión
Obtenga el almacenado_hash y almacenado_salt de la base de datos basada en el nombre de usuario
stored_hash =b '$ 2b $ 12 $ ek11we0gqj8dk9j7cqh9yoc9/s8/6rxlg13n/l604qg1v14k6ydna' # Ejemplo - almacenado de arriba
stored_salt =b '$ 2b $ 12 $ ek11we0gqj8dk9j7cqh9yo' # Ejemplo - almacenado desde arriba
Si verify_password (Entered_password, Stored_hash, Stored_salt):
Imprima ("Contraseña verificada! Iniciar sesión exitoso")
demás:
Imprimir ("Contraseña incorrecta. Iniciar sesión Fallado")
`` `` ``
Consideraciones importantes:
* Complejidad de contraseña: Haga cumplir las reglas de complejidad de la contraseña (longitud mínima, caracteres requeridos) para hacer que las contraseñas sean más difíciles de adivinar.
* Limitando la velocidad: Implementar la limitación de la tasa en los intentos de inicio de sesión para prevenir los ataques de fuerza bruta. Bloquear cuentas después de un cierto número de intentos fallidos.
* Autenticación de dos factores (2fa): Use 2FA para una capa adicional de seguridad. Incluso si la contraseña se ve comprometida, un atacante aún necesitará un segundo factor (por ejemplo, un código de una aplicación móvil).
* Auditorías de seguridad regulares: Realice auditorías de seguridad regulares para identificar y abordar las posibles vulnerabilidades.
* Mantenga las bibliotecas actualizadas: Mantenga las bibliotecas y dependencias de Hashing actualizadas para beneficiarse de los últimos parches de seguridad.
* Mecanismos de restablecimiento de contraseña: Implemente mecanismos de restablecimiento de contraseña segura utilizando preguntas de verificación por correo electrónico o seguridad.
Al usar estos principios, los sistemas pueden verificar efectivamente las contraseñas mientras protegen los datos del usuario del compromiso. Es un aspecto crucial de la seguridad general.