es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    require 'openssl'
    
    # El usuario ingresa la contraseña maestra
    master_password = obtener_contraseña_maestra_del_usuario()
    
    # Generar la clave de cifrado usando PBKDF2 con una sal y un contador de iteraciones
    salt = OpenSSL::Random.random_bytes(8)
    iteration_count = 20000 # o un valor más alto para una seguridad más fuerte
    longitud_clave = 32 # o un valor más alto si deseas una clave más larga
    clave = OpenSSL::PKCS5.pbkdf2_hmac_sha256(master_password, salt, iteration_count, longitud_clave)
    
    # Cifrar la contraseña maestra usando la nueva clave
    cipher = OpenSSL::Cipher.new('AES-256-CBC')
    cipher.encrypt
    iv = cipher.random_iv
    cipher.key = clave
    contraseña_maestra_cifrada = cipher.update(master_password) + cipher.final
    
    # Almacenar la contraseña cifrada y los metadatos en algún lugar seguro
    almacenar_contraseña_cifrada(contraseña_maestra_cifrada, iv, salt, iteration_count)
    

    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.

Comments are closed.