Quiero implementar un sistema de autenticación siguiendo buenas prácticas, quiero que sea lo más simple posible y seguro (no voy a implementar alguna función de hashing mágico o algo para sentirse un héroe ...) con el único deseo de utilizar el hash ya conocido Pero no estoy seguro de la forma correcta de usarlo. Leí algunos artículos sobre cómo Lastpass (una empresa de administración de contraseñas) se las arregla para manejar su autenticación y me encantó su idea. Así que quería implementar mi propia autenticación basada en ella.
Básicamente, estoy creando una clave de autenticación desde la contraseña en el lado del cliente (por lo que la contraseña nunca se envía como un texto del plan al servidor). esa clave de autenticación estoy enviando al servidor que algunas operaciones de hash también en el lado del servidor y compara el resultado con el que está dentro de la base de datos.
En mi parte del cliente:
auth_key = PBKDF2(SHA256, password+username, last_login_fe_salt, fe_rounds)
explicación - hashing contraseña + nombre de usuario + last_login_fe_salt texto fe_rounds veces
last_login_fe_salt - > una sal aleatoria enviada al usuario una vez que ingrese su nombre de usuario en el campo de texto - Para ser honesto, no estoy seguro de cómo este last_login_fe_salt es eficaz para la criptografía contra los ataques del Diccionario, pero al menos dos personas que tienen la misma contraseña enviarán diferentes hashes en su red. cualquier pirata informático puede obtener esta información preguntando desde el servidor, puedo agregar limitaciones del lado del servidor (req / s si hace alguna diferencia, etc., hágame saber lo que piensa), además de agregar captcha puede ser una buena idea. Cuando un usuario inicia sesión correctamente, el servidor genera una nueva cadena aleatoria y la guarda en la base de datos.
* No vi ninguna explicación de qué sal utiliza Lastpass en su hashing del lado del cliente, están usando el algoritmo PBKDF2 que necesita un parámetro de sal.
fe_rounds - > Número de rondas dadas por el servidor al escribir el nombre de usuario - es fijo para todos y configurable por el servidor, también en los artículos que leí sobre Lastpass no explican desde dónde reciben el número de rondas del lado del cliente ...
así que ahora enviamos auth_key tal como está al servidor ...
En el lado del servidor
ahora estamos creando un nuevo hash para comparar el que está dentro de la base de datos. ¿Por qué otro hash? Si entiendo correctamente, enlazamos el hash para los datos del lado del servidor, como una combinación de una contraseña (que solo el usuario conoce) y los datos del servidor.
db_auth=PBKDF2(SHA256, auth_key, user_be_salt, 100,000+user_configurable_rounds)
user_be_salt - > un número aleatorio que se guardó en db conocido solo por el servidor y los que obtienen la base de datos, esto cambia en cada inicio de sesión exitoso.
user_configurable_rounds - > número de iteraciones, cada usuario puede elegir la cantidad de iteraciones (como en Lastpass) para que el atacante también tenga que adivinar el número o las iteraciones?
Me encantaría saber qué piensa de este sistema de autenticación, si es incorrecto que explicarme por qué y decirme qué hace Lastpass porque no entendí todo su flujo de autenticación.