Crittografia AES-256-CBC IV contro sale durante la crittografia dei file con una chiave segreta

0

Sto scrivendo una piccola classe da aggiungere alla mia applicazione che gestirà cose come i segreti di configurazione. (Non voglio entrare in questo argomento poiché molte ricerche sono andate nell'approccio che abbiamo deciso di adottare per questo.)

Uno dei requisiti è crittografare i segreti dei file. (Pensa a una chiave di certificato TLS oa una chiave segreta PGP.) Sono in grado di generare (e decodificare) una chiave segreta che può essere utilizzata per crittografare / decrittografare i file all'esterno dell'applicazione utilizzando il servizio KMS di AWS. (Vedi questo per informazioni su ciò che effettivamente restituisce: link )

Quindi, per il mio modo di pensare ciò significa solo che ho bisogno di memorizzare la versione crittografata della chiave insieme al file in modo da poter decodificare la chiave, usarla per decrittografare il file quando viene utilizzato.

La mia confusione deriva dall'uso delle funzioni openssl encrypt / decrypt sui dati del file a causa della IV. Ho letto molto di IV negli ultimi due giorni e ne ho compreso lo scopo generale, ma mi rimangono molte domande che cercano di conciliare ciò con quello che vedo nel "mondo reale".

Quando uso openssl da una riga di comando per crittografare un file che ho letto per usarlo:

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

Notate che non è passata alcuna IV, sebbene il parametro -salt possa servire a uno scopo simile?

Ma quando decrypt lo stesso file uso un comando come questo:

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

Nota nessun parametro -salt, nessun IV o qualcosa di simile, quindi come è in grado di decodificare il file senza quelle informazioni?

Nelle funzioni openssl encrypt / decrypt in PHP, e in altre discussioni su IV, è altamente raccomandato l'uso di un IV durante la crittografia dei dati, il che suggerisce che ho bisogno di memorizzare / utilizzare l'IV durante la decodifica, ma questo non viene eseguito dalla riga di comando, quindi come funziona? La riga di comando sopra è meno sicura per quello? Non è necessario utilizzare un IV in base al fatto che ogni file avrà la propria chiave di crittografia sicura?

    
posta CameronGo 02.09.2016 - 16:35
fonte

2 risposte

2

Come affermato in questo thread

The OpenSSL developers preferred to derive the IV from the password, just like the key (i.e. they produce from the password a long sequence, which they split in two, one half being the encryption key, the other half being the IV).

L'IV non ha bisogno di essere fornito per la decrittografia poiché OpenSSL lo deriva dalla password. Il thread menziona anche alcuni inconvenienti dell'utilizzo del metodo di crittografia dei file di OpenSSL che vale la pena considerare, come non avere un MAC per verificare l'integrità del file crittografato.

    
risposta data 02.09.2016 - 17:11
fonte
1

Ecco la funzione PHP che ho implementato:

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;
}
    
risposta data 21.09.2016 - 15:31
fonte

Leggi altre domande sui tag