Estoy diseñando un sistema de registro / autenticación de usuario para un sitio web y se me ocurrió este diseño para autenticación basada en contraseña.
Me gustaría saber si esto es razonable. (ignorando las cookies para las credenciales de almacenamiento en caché, auth, etc.)
Algunas cosas las incorporé al diseño, pero no estoy seguro de cuánto "ayudan" a la seguridad:
-
en caso de que la base de datos del servidor esté comprometida, hashedPw se envíe desde el cliente para que saltedSecret se pueda volver a verificar. (hashedPw no se almacena en el servidor)
-
desafío (chalSecret) para evitar un ataque de repetición
-
el costo de scrypt se puede ajustar con el tiempo, pero como espero usar una implementación de scrypt de javascript en los navegadores, tal vez no sea una característica tan buena.
Otra pregunta es si puedo asegurar fácilmente el envío inicial de saltedSecret durante el registro del usuario, pero supongo que el uso de HTTPS será lo suficientemente bueno para eso.
Si hay formas en que pueda simplificar esto, hágamelo saber.
NOTA: consulte la sección de edición a continuación para ver los cambios que simplifican este diseño.
EDITAR:Algunascosasquemeocurrierondesdequepubliquéesto:
TLS protege contra ataques de repetición , por lo que puedo eliminar toda la sección de desafío. - en el lado del servidor, debería (como mínimo) almacenar un hash del saltedSecret. Lo mejor es guardar un scrypt de él. Esto tiene un buen efecto secundario al eliminar el requisito del usuario de enviar el hashedPw durante el inicio de sesión.
- Nuevo diagrama con estos cambios: