¿Cómo encripto una clave de encriptación?
Tengo un gestor de contraseñas que estoy implementando en Ruby. Encriptar las contraseñas es bastante fácil gracias a OpenSSL, pero también necesito pedirle al usuario una contraseña maestra, que es una contraseña para ver, cambiar y agregar contraseñas. Una vez que el usuario ingrese su contraseña maestra, pretendo que se encripte y se guarde de alguna manera en el archivo de contraseñas. Pero OpenSSL requiere una contraseña para encriptar y desencriptar. Para las contraseñas normales, la clave es la contraseña maestra, entonces, ¿qué debería usar como clave de encriptación para la contraseña maestra?
davy.ai
La clave de cifrado para la contraseña maestra idealmente no debe derivarse de la misma contraseña maestra. Esto se debe a que crearía una dependencia circular: necesitas la contraseña maestra para cifrarla, pero no puedes obtener la contraseña maestra sin descifrarla primero.
Una solución a este problema es utilizar una función de derivación de clave (KDF, por sus siglas en inglés) para generar una nueva clave basada en la contraseña maestra. Esta clave luego se puede utilizar para cifrar y descifrar la propia contraseña maestra.
Una KDF común para este propósito es PBKDF2. Puedes utilizar la biblioteca OpenSSL de Ruby para implementarla de la siguiente manera:
Cuando el usuario desee acceder a sus contraseñas en el futuro, deberá ingresar su contraseña maestra nuevamente. Puedes utilizar la misma KDF y el mismo proceso de cifrado para verificar si la contraseña maestra ingresada es correcta y recuperar la contraseña maestra descifrada.