database - simetricas - ¿Usar una sal aleatoria en el cifrado de contraseñas?
contraseña encriptada sql (6)
La única manera de no enviar un valor no encriptado que se puede usar para iniciar sesión es usar SSL. Si el hash se envía al servidor, el mismo hash se puede olfatear y usar para iniciar sesión. Hazlo desde el lado del servidor.
+1 a lo que dijo ruslik sobre la sal. Evita los ataques de diccionario / arcoiris. Una tabla de arcoíris para una contraseña promedio + varios bytes de datos binarios aleatorios sería astronómicamente enorme.
He visto algunos otros temas sobre este tema, pero parece que no puedo encontrar algunas respuestas a algunas preguntas que implican el uso de una sal al azar en el cifrado de contraseñas. A mi entender, los pasos son algo como esto:
- Genera una sal aleatoria para el usuario.
- Agregue la sal a su contraseña.
- Use algo como SHA-2 para calcular el resultado.
- Almacene la contraseña de sal y hash en la base de datos.
¿Cómo funciona este método al recuperar la contraseña del usuario y verificar el inicio de sesión? Una respuesta dice que la sal del usuario debe ser recuperada, añadida a su contraseña ingresada, procesada y luego comparada con el hash almacenado, ¿pero esto no plantea algunos problemas? A saber:
- ¿Cómo recuperas la sal sin comprometer a ese usuario? Si alguien quisiera usar la fuerza bruta de la contraseña de una cuenta determinada, ¿no podrían recuperar la sal que se envió desde el servidor para cifrar la contraseña ingresada, eliminando de ese modo la seguridad que se agrega al agregar sal?
- Si evitamos el problema anterior haciendo el lado del servidor de recuperación de sal, ¿no enviaremos sin encriptar la contraseña ingresada del usuario en un punto u otro (para que luego se agregue a la sal recuperada)?
La sal nunca debe exponerse fuera del servicio: su instinto es correcto, esto sería exponer la sal e introducir riesgos.
Cualquier comunicación entre su cliente y el servidor debe ocurrir a través de una conexión SSL, o al menos utilizando algún tipo de encriptación de la interacción.
Tenga en cuenta el propósito de la sal: dificultar a alguien el cálculo previo de códigos hash y, por lo tanto, poder buscar contraseñas en caso de que la base de datos se vea comprometida. Una sal de 8 bits hace que el espacio de hash sea 256 veces más grande, lo que hace que el precalculado sea mucho más difícil. La sal no se trata de asegurar la comunicación, hay otras soluciones para eso.
La seguridad introducida por salt es que obtienes hash para algo mucho más grande y no estándar que la contraseña simple. No importa si su algoritmo está cerrado, ya que protege el hash almacenado en la base de datos de los ataques de arcoiris o de diccionario.
También se recomienda tomar hash varias veces de forma recursiva, tal vez leer la sal en cada iteración, de modo que la fuerza bruta dure más tiempo.
EDITAR: a lo que Bevan dijo sobre la comunicación: generalmente el esquema "number used once" (NONCE) se usa para transmitir contraseñas sobre canales no seguros. El servidor le da una cadena aleatoria nunca antes utilizada al cliente, la agrega a la contraseña simple, calcula el hash y lo envía. Esto lo protege de los ataques de espionaje.
Las contraseñas hash protegen contra las contraseñas claramente visibles, y las saladas de guardias contra ataques de diccionario. En cuanto a la protección de contraseñas durante el transporte, recomendaría SSL / TLS.
Utilizo una sal fija (para todas las contraseñas) que está codificada en el código de la aplicación. Suponiendo que la sal no se puede exponer (por ejemplo, a través de la interfaz de usuario de la aplicación), esto parece simple y lo suficientemente bueno.
Tienes que usar sal aleatoria porque el objetivo de usarlo es proteger contra algunos tipos de ataques como el ataque de diccionario, el ataque de fuerza bruta y el ataque de arco iris. por lo tanto, es tan importante generar sal aleatoria para cada contraseña y almacenar la contraseña y el saliente hash en la tabla del usuario o adjuntarlo al perfil del usuario. Cuando quiera validar la contraseña del usuario, es suficiente para ingresar la contraseña con la sal almacenada y compararla con el valor hash almacenado. No creo que @cherouvim lo aconseje porque parece que no le importan los ataques anteriores. Para obtener más información, sugiero un artículo increíble, simple y comprensible de Defuse Security
Buena suerte.