Tengo algunos datos seguros creados en mi aplicación cliente que deseo almacenar en el servidor como copia de seguridad para el usuario.
El usuario ya tiene una contraseña para autenticarse con el servidor. La contraseña nunca se envía al servidor (uso SRP6 para autenticar al usuario).
Así que aquí está mi pensamiento ...
- Use Fortuna PRNG con múltiples entradas de eventos (mouse, teclado, etc.) para generar un salt.
- Use Salt y la contraseña como entradas para Scrypt o PBKDF2 + SHA512 con más de 40,000 iteraciones para generar una clave de 512 bits.
- Use los primeros 256 bits de la clave para cifrar los datos privados utilizando AES-256-CBC con IV aleatorio.
- Envíe el texto cifrado y la sal al servidor.
- Muestre al usuario el recuento de iteraciones KDF como un número que necesitan memorizar. Lo solicitaremos cuando tengamos que descifrar los datos del lado del cliente más adelante.
Entonces mi pregunta es ... ¿es esto suficientemente seguro? Inicialmente, iba a almacenar el servidor de recuento de iteraciones también, pero sentía que un atacante que accediera al servidor podría ser capaz de forzar fácilmente la clave. Nuevamente, si los usuarios podrán recordar una contraseña y un número es otra pregunta.