¿Mi estrategia de autenticación es segura?

0

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.

    
pregunta Lihai 26.07.2017 - 14:42
fuente

1 respuesta

1

En general, no está mal, con algunos defectos en los detalles.

  • Si last_login_fe_salt es aleatorio y cambia cada inicio de sesión, el resultado PBKDF2 enviado al servidor falla. Esto debe almacenarse en el registro del servidor para ese nombre de usuario y mantenerse igual.

    • Las rondas también deben mantenerse igual, y almacenarse por nombre de usuario, para que pueda cambiar los valores predeterminados.
    • Si desea poder cambiarlos, debe poder enviar al cliente DOS cuentas de sal y DOS iteraciones; viejo y nuevo; entonces recuperas ambos resultados; ejecute ambos a través del algoritmo del lado del servidor, luego valide el resultado anterior y, si es válido, almacene el nuevo resultado.
  • ¿Por qué no estás usando SHA-512? Las operaciones de 64 bits requeridas disminuyen el margen de ventaja que tienen los atacantes basados en GPU sobre sus sistemas basados en CPU.

  • No codifique las rondas laterales del servidor de 100,000; Si realmente quieres esto, entonces
    • almacene las rondas de servidor requeridas por el sistema y las rondas de servidor requeridas por el usuario en campos separados
    • considere la posibilidad de mover la adición de seguridad del recuento de usuarios al lado del cliente; ¡De lo contrario, atacará los ataques de denegación de servicio mediante un recuento de vueltas demenciales utilizando toda su CPU!

¡Felicitaciones por elegir una función de hash de contraseña de clave iterada conocida con cuentas redondas razonables!

    
respondido por el Anti-weakpasswords 10.01.2018 - 05:01
fuente

Lea otras preguntas en las etiquetas