Estoy trabajando en un sistema de autenticación para un servicio web basado en Bitcoin. Como parte del servicio, los usuarios realizan algunas operaciones menos confidenciales (en su mayoría, leen y envían varios tipos de información) y algunas operaciones altamente sensibles (controlan los fondos de Bitcoin mediante la firma de transacciones).
Estoy buscando crear un sistema de autenticación que:
- Se basa en ECDSA y firmas digitales
- Permite un fácil acceso a las operaciones menos sensibles, almacenando permanentemente la clave en el almacenamiento local
- Requiere información adicional para operaciones altamente sensibles, lo que es más difícil de obtener para un atacante
Esto es lo que planeo hacer actualmente:
Proceso de creación de cuenta
- El usuario se registra con dos contraseñas: contraseña A1 y contraseña A2
- La contraseña A1 se genera como 12 palabras aleatorias (132 bits)
- La contraseña A2 se genera como 4 palabras aleatorias (44 bits)
- Se requiere que el usuario escriba (pero no recuerde) la contraseña A1, y recuerde la contraseña A2 (y posiblemente escriba hasta que la recuerde, en cuyo momento debe destruir la copia escrita)
- La contraseña A1 se usa para crear la clave privada A1 usando
A1_key = Scrypt(A1_password, salt=GLOBAL_SALT||email, N=20, r=8, p=1)
- La clave A1 y la contraseña A2 se usan para crear la clave privada A2 usando
A2_key = Scrypt(A2_password, salt=H(A1_key), N=10, r=8, p=1)
- Las claves públicas para A1 y A2 se guardan en el servidor.
Iniciar sesión
- El usuario inicia sesión con su contraseña A1, que se utiliza para volver a crear su clave pública.
- El navegador recuerda la clave A1 en el almacenamiento local, por lo que no es necesario que el usuario vuelva a ingresarla, a menos que inicie sesión desde una nueva máquina o borre su almacenamiento local
- La tecla A1 permite autorizar las acciones menos sensibles
Acciones sensibles
- Realice acciones confidenciales, se le solicita al usuario que ingrese su contraseña A2
- La contraseña A2 se utiliza para derivar la clave A2 y firmar digitalmente la operación
- La clave A2 se borra de la memoria inmediatamente después de ser utilizada, y el navegador nunca la recuerda
Con ese sistema instalado, se necesitan las contraseñas A1 y A2 para las operaciones altamente sensibles. Un atacante que obtenga acceso a la máquina del usuario solo tendrá acceso a la tecla A1; para obtener acceso a A2 se requiere un ataque activo mientras se proporciona la contraseña A2.
Mis preguntas
- ¿Cómo te sientes acerca de las propiedades de seguridad de dicho sistema? ¿Ves alguna desventaja o vulnerabilidad que me esté perdiendo?
- ¿Cree que la molestia de requerir que los usuarios manejen dos contraseñas vale la pena?
- ¿Ves alguna manera de mejorar mi esquema sugerido?