AES-256-CBC cifrado IV vs sal al cifrar archivos con una clave secreta

0

Estoy escribiendo una clase pequeña para agregar a mi aplicación que manejará cosas como los secretos de configuración. (No quiero entrar en este tema, ya que se han realizado muchas investigaciones sobre el enfoque que hemos decidido adoptar para esto).

Uno de los requisitos es cifrar los secretos de los archivos. (Piense en una clave de certificado TLS o una clave secreta PGP). Puedo generar (y descifrar) una clave secreta que se puede usar para cifrar / descifrar los archivos fuera de la aplicación mediante el servicio AWS KMS. (Vea esto para obtener información sobre lo que realmente devuelve: enlace )

Por lo tanto, a mi modo de ver, eso solo significa que necesito almacenar la versión cifrada de la clave junto con el archivo para poder descifrar la clave, usarla para descifrar el archivo cuando se usa.

Mi confusión proviene del uso de las funciones de cifrado / descifrado de openssl en los datos del archivo debido a la IV. He leído mucho sobre IV en los últimos días y entiendo su propósito general, pero me quedan varias preguntas que intentan conciliar esto con lo que veo en el "mundo real".

Cuando uso openssl desde una línea de comando para cifrar un archivo que he leído para usar esto:

  

openssl aes-256-cbc -salt -in secrets.txt -out secrets.txt.enc

Observe que no se ha pasado un IV, aunque el parámetro -salt puede tener un propósito similar.

Pero cuando descifro el mismo archivo, uso un comando como este:

  

openssl aes-256-cbc -d -in secrets.txt.enc -out secrets.txt.new

Observe que no hay ningún parámetro de sal, ningún IV ni nada de esa naturaleza, así que, ¿cómo puede descifrar el archivo sin esa información?

En las funciones de cifrado / descifrado de openssl en PHP, y otras discusiones en torno a IV, parece muy recomendable utilizar un IV al cifrar datos, lo que sugiere que necesito almacenar / usar el IV al descifrarlo también, pero esto no se está haciendo desde la línea de comandos, entonces, ¿cómo está funcionando? ¿Es la línea de comando de arriba menos segura para eso? ¿No necesito usar un IV basado en el hecho de que cada archivo tendrá su propia clave de cifrado segura?

    
pregunta CameronGo 02.09.2016 - 16:35
fuente

2 respuestas

2

Como se indica en este thread

  

Los desarrolladores de OpenSSL prefirieron derivar el IV de la contraseña, al igual que la clave (es decir, producen a partir de la contraseña una secuencia larga, que se dividen en dos, una mitad es la clave de cifrado, la otra mitad es la IV) .

No es necesario proporcionar el IV para el descifrado ya que OpenSSL lo deriva de la contraseña. El hilo también menciona algunos inconvenientes de usar el método de cifrado de archivos de OpenSSL que vale la pena considerar, como no tener un MAC para verificar la integridad del archivo cifrado.

    
respondido por el ARau 02.09.2016 - 17:11
fuente
1

Aquí está la función PHP que implementé:

public function encryptFile($plainfile, $keyid) {
    $plaindata = file_get_contents($plainfile);
    $encfile = $plainfile.'.enc';
    $kms = KmsClient::factory(array(
        'region' => $this->kms_region,
        'version' => $this->kms_version
    ));

    $kmsresponse = $kms->generateDataKey(array(
        'KeyId'=>$keyid,
        'KeySpec'=>'AES_256',
    ));
    $key = $kmsresponse->get('Plaintext'); // Temporarily used only NEVER STORE THIS ANYWHERE
    $cipherkey = base64_encode($kmsresponse->get('CiphertextBlob'));
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($this->cipheralgo));
    $encdata = openssl_encrypt($plaindata,$this->cipheralgo,$key,OPENSSL_RAW_DATA,$iv);

    // This writes the first few bytes of the file as the IV and then the reast is appended as encrypted data.  Decryption expects to find the file in this pattern.
    file_put_contents($encfile,$iv);
    file_put_contents($encfile,$encdata,FILE_APPEND);

    $response = json_encode(array('encfile'=>$encfile,'cipherkey'=>$cipherkey));
    return $response;
}
    
respondido por el CameronGo 21.09.2016 - 15:31
fuente

Lea otras preguntas en las etiquetas