2012-06-09 4 views
7

Ich schreibe eine Android-Anwendung, die zum Verschlüsseln und Entschlüsseln von Dateien mit AES 256. Ich benutze AES-CBC-Modus und PBKDF2 zum Ableiten des AES-Schlüssels von einem Benutzer eingegebenes Passwort. Außerdem erzeuge ich ein sicheres, pseudozufälliges Salz für den Verschlüsselungsschlüssel jeder Datei. Ich speichere die IV und das Salz mit der verschlüsselten Datei, damit ich sie später erneut lesen und neu generieren kann, um die Datei entschlüsseln zu können.Speichert das Speichern des Salzes zusammen mit der verschlüsselten Datei die Sicherheit?

Meine Frage: Speichert das Salz zusammen mit der verschlüsselten Datei die Sicherheit und irgendeine Bedeutung des Salzes selbst? Kann ein Angreifer, der das Salz und die IV kennt, keinen Offline-Brute-Force-Angriff gegen die verschlüsselte Datei durchführen, um den Verschlüsselungsschlüssel herauszufinden?

Antwort

10

Der Hauptzweck des Salzes ist nicht geheim zu sein, sondern um sicherzustellen, dass ein Angreifer keine Shortcuts verwenden kann, wenn er versucht, das Passwort brutal zu erzwingen, wie zB Rainbow-Tabellen (eine bestehende oder eine neue) um mehrere verschlüsselte Dateien zu verwenden) oder mehrere Dateien (die unterschiedliche Salze haben sollten) gleichzeitig zu erzwingen.

Solange Ihr Passwort genug Entropie hat und die Anzahl der Iterationen in Ihrer Schlüsselableitungsfunktion hoch genug ist, ist das Speichern des Salzes mit dem Chiffretext kein Problem. Das Salz alleine erlaubt niemandem, die Datei zu entschlüsseln.

Auch wenn Sie das Salz geheim halten wollen (es wird normalerweise "Pfeffer" anstelle von Salz genannt), müssen Sie an einen Mechanismus denken, um das richtige Salz zu demjenigen zu bekommen, der die Entschlüsselung legitimiert.

+0

Was aber, wenn der Angreifer eine Rainbow-Tabelle mit einem gültigen Salz erstellt, das er im Klartext aus der Datei lesen kann? –

+9

@AlexAmiryan Der Bau eines Regenbogentisches ist mindestens so teuer wie ein Brute-Force-Angriff. Wenn Sie also die Tabelle nicht wiederverwenden können (und das ist es, was Salze verhindern), ist es nutzlos, eine Tabelle zu erstellen. Führen Sie einen Brute-Force-Angriff direkt aus. – CodesInChaos

2

Salt wird für Einwegfunktionen verwendet, z. B. zum Hashen eines Kennworts.

Random IV wird für Zwei-Wege-Funktionen wie das Verschlüsseln von Daten verwendet, die später entschlüsselt werden können.

Sie sind beide zufällige Bytes und werden verwendet, um zu verhindern, dass die gleiche Information das gleiche Ergebnis erzeugt, nachdem sie von der Funktion angewendet wurde. Wenn also zwei Personen dasselbe Passwort zum Speichern ihrer Daten und zum Speichern der gleichen Information wählen, sind die verschlüsselten Bytes unterschiedlich.

Sie können sie zusammen mit der verschlüsselten Datei speichern.

Verwenden Sie auch mehr als 1 Iteration mit PBKDF2 oder sonst ist es ziemlich nutzlos. Laut Wikipedia verwendet iOS 3 2.000 Iterationen und iOS 4 10.000.

+1

Können Sie genauer beschreiben, warum es sicher ist, IV und Salz zusammen mit der verschlüsselten Datei zu speichern? –