Wie kann man viele Dateien mit AES-GCM verschlüsseln, ohne jedes Mal die Schlüsselableitungsfunktion auszuführen?
Verknüpfte Frage: AES verschlüsselt mehrere Dateien
Mit a password
muss ich 100.000 Dateien verschlüsseln. (Vielleicht 100.000 Dateien heute; oder vielleicht 50.000 heute, 10.000 morgen und 40.000 Dateien in der nächsten Woche).
Bisher habe ich das gemacht (Pseudocode):
for each file: plaintext = file.read() nonce = getrandom(bytes=16) key = KDF_PBKDF2(password, salt=nonce, count=1000000) # very slow for each file! ciphertext, tag = AES_GCM_cipher(key, nonce=nonce).encrypt(plaintext) write to disk: nonce | ciphertext | tag
und um die verschlüsselte Datei zu entschlüsseln
nonce, ciphertext, tag = file.read() key = KDF_PBKDF2(password, salt=nonce, count=1000000) # very slow for each file! plaintext = AES_GCM_cipher(key, nonce=nonce).decrypt(ciphertext)
Dies ist natürlich nicht optimal, da ich die KDF-Funktion für jede Datei ausführe und dies langsam ist!
Ich habe über diese Lösung nachgedacht:
# do this ONLY ONCE for each encryption session: salt = getrandom(bytes=16) key = KDF_PBKDF2(password, salt=salt, count=1000000) # run only once for each file: plaintext = file.read() nonce = getrandom(bytes=16) ciphertext, tag = AES_GCM_cipher(key, nonce=nonce).encrypt(plaintext) write to disk: salt | nonce | ciphertext | tag
Dies hat jedoch den Nachteil, dass
salt
am Anfang jeder verschlüsselten Datei 16 weitere Bytes ( ) vorangestellt werden müssen. Ist es eine übliche Praxis?Und vor allem hat es folgenden Nachteil beim Entschlüsseln:
for each encrypted file: salt, nonce, ciphertext, tag = file.read() # since salt may be different for each file # we have to run: key = KDF_PBKDF2(password, salt=salt, count=1000000) # very slow for each file! ...
Da dies
salt
am Anfang jeder verschlüsselten Datei steht, müssen wir die KDF-Funktion ausführen ... für jede verschlüsselte Datei, die wir entschlüsseln möchten! Dies wird sehr langsam sein.Wir könnten sie in den Cache stellen
cache[salt] = key
, sodasssalt
wir sie bereits haben , wenn wir sie wiederfindenkey
, aber ich bin mir nicht sicher, ob dies eine elegante Lösung ist.
Frage: Mit welchem Schema können 100.000 Dateien (in einem Durchgang oder in mehreren Sitzungen) mit einem Kennwort mit AES-GCM verschlüsselt werden?
Antworten
Eine ernsthafte Frage zur passwortbasierten Kryptographie darf nicht von Argon2 abweichenKDF_PBKDF2
, sondern zu Argon2 laufen (oder verschlüsseln, wenn es leichter verfügbar ist)! Der Bitcoin-Abbau hat (im Jahr 2020) gezeigt, dass dedizierte ASICs, die SHA-256 mit hoher Geschwindigkeit (220 TH / s) und Effizienz (15 pJ / H) ausführen, für einige tausend US-Dollar im Handel erhältlich sein können. Dies macht es unhaltbar, sich auf PBKDF2-HMAC zu verlassen, das auf Standardhardware ausgeführt wird, um vom Benutzer gewählte Passwörter in Hochsicherheitsanwendungen zu erweitern.
Die vorgeschlagene Methode weist eine Eigenschaft auf: Sie salt
ist mehreren Dateien gemeinsam, wenn und salt
nur dann, wenn sie zusammen verschlüsselt wurden. Dies ist sowohl ein möglicherweise unerwünschtes Informationsleck als auch eine Möglichkeit, den genannten Nachteil zu beheben: Der bei der Entschlüsselung verwendete Code zum Strecken des Kennworts kann einen RAM-Cache von ( salt
, key
) Paaren verwalten.
Ich würde in Betracht ziehen, AES-GCM durch AES-GCM-SIV zu ersetzen , um im Falle eines Stotterns des RNG beruhigt zu sein, aber bedenken Sie, dass zwei Durchgänge über die Daten erforderlich sind.
So sehr ich befürworte, das letzte Byte zu kürzen, wenn es zählt (z. B. wenn die Daten auf einem Barcode liegen oder ein langsames oder / und verbrauchendes Kommunikationsmedium durchlaufen), empfehle ich nicht, bei der Dateiverschlüsselung wie wir zu sparen salt
und die nonce
Größe zu ändern sind in den 1980er Jahren.