Warum muss ich die Rfc2898DeriveBytes-Klasse (in .NET) verwenden, anstatt das Kennwort direkt als Schlüssel oder IV zu verwenden?


76

Was ist der Unterschied zwischen der Verwendung von Rfc2898DeriveBytes und der Verwendung von Rfc2898DeriveBytes Encoding.ASCII.GetBytes(string object);?

Ich habe mit beiden Ansätzen relative Erfolge erzielt, wobei der erstere ein langwierigerer Ansatz ist, bei dem der letztere einfach und auf den Punkt gebracht ist. Beide scheinen es Ihnen zu ermöglichen, irgendwann dasselbe zu tun, aber ich kämpfe darum, den Punkt zu erkennen, an dem ich Ersteres gegenüber Letzterem verwenden kann.

Das Grundkonzept, das ich verstehen konnte, ist, dass Sie String-Passwörter in Byte-Arrays konvertieren können, die beispielsweise für eine symmetrische Verschlüsselungsklasse verwendet werden AesManaged. Über die RFC-Klasse können Sie jedoch beim Erstellen Ihres RFC-Objekts Salt-Werte und Kennwörter verwenden. Ich nehme an, es ist sicherer, aber das ist bestenfalls eine ungebildete Vermutung! Außerdem können Sie damit Byte-Arrays einer bestimmten Größe zurückgeben.

Hier sind einige Beispiele, die Ihnen zeigen, woher ich komme:

byte[] myPassinBytes = Encoding.ASCII.GetBytes("some password");

oder

string password = "P@%5w0r]>";
byte[] saltArray = Encoding.ASCII.GetBytes("this is my salt");
Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(password, saltArray);

Das Objekt 'rfcKey' kann jetzt zum Einrichten der Eigenschaften .Key oder .IV für eine symmetrische Verschlüsselungsalgorithmusklasse verwendet werden.

dh.

RijndaelManaged rj = new RijndaelManaged ();
rj.Key = rfcKey.Getbytes(rj.KeySize / 8); 
rj.IV = rfcKey.Getbytes(rj.Blocksize / 8);

'rj' sollte bereit sein zu gehen!

Der verwirrende Teil ... Kann ich also nicht einfach das Array 'myPassInBytes' verwenden, um mein 'rj'-Objekt einzurichten, anstatt das' rfcKey'-Objekt zu verwenden?

Ich habe dies in VS2008 versucht und die sofortige Antwort lautet NEIN. Aber habt ihr eine besser ausgebildete Antwort darauf, warum die RFC-Klasse gegenüber der anderen Alternative verwendet wird, die ich oben erwähnt habe?


Diese Frage bezieht sich auf die Überarbeitung und Vorbereitung auf die Prüfung!
IbrarMumtaz

Antworten:


184

Sie möchten wirklich, wirklich kein Benutzerkennwort direkt als Kryptoschlüssel verwenden, insbesondere bei AES.

Rfc2898DeriveBytes ist eine Implementierung von PBKDF2. Es wird wiederholt das Benutzerkennwort zusammen mit dem Salt gehasht. Dies hat mehrere Vorteile:

Erstens können Sie Kennwörter beliebiger Größe verwenden - AES unterstützt nur bestimmte Schlüsselgrößen.

Zweitens bedeutet das Hinzufügen des Salzes, dass Sie dieselbe Passphrase verwenden können, um mehrere verschiedene Schlüssel zu generieren (vorausgesetzt, das Salz ist keine Konstante, wie in Ihrem Beispiel). Dies ist wichtig für die Schlüsseltrennung. Die Wiederverwendung von Schlüsseln in verschiedenen Kontexten ist eine der häufigsten Arten, wie kryptografische Systeme beschädigt werden.

Die mehrfachen Iterationen (standardmäßig 1000) verlangsamen Angriffe zum Erraten von Passwörtern. Stellen Sie sich jemanden vor, der versucht, Ihren AES-Schlüssel zu erraten. Wenn Sie nur das Passwort verwendet haben, ist dies unkompliziert - versuchen Sie einfach jedes mögliche Passwort als Schlüssel. Andererseits muss der Angreifer bei PBKDF2 zuerst 1000 Hash-Iterationen für jede Kennwortschätzung durchführen. Während es einen Benutzer nur geringfügig verlangsamt, wirkt es sich unverhältnismäßig stark auf einen Angreifer aus. (Tatsächlich ist es durchaus üblich, viel höhere Iterationszahlen zu verwenden; 10000 wird allgemein empfohlen).

Dies bedeutet auch, dass der endgültige Ausgabeschlüssel gleichmäßig verteilt ist. Wenn Sie beispielsweise das Kennwort verwenden, sind normalerweise 16 von 128 Bits des Schlüssels 0 (das hohe ASCII-Bit). Das genau dort macht die Schlüsselsuche sofort 65536-mal einfacher als es sein sollte, selbst wenn das Erraten des Passworts ignoriert wird.

Schließlich weist AES spezifische Schwachstellen mit verwandten Schlüsselangriffen auf. Verwandte Schlüsselangriffe sind möglich, wenn ein Angreifer einige mit mehreren Schlüsseln verschlüsselte Daten kennt und eine bekannte (oder vermutete) Beziehung zwischen ihnen besteht. Wenn Sie beispielsweise Daten sowohl mit dem Kennwortschlüssel "My AES key sucks" (16 Byte für AES-128) als auch mit "MY AES KEY SUCKS" verschlüsselt haben, ist möglicherweise ein entsprechender Schlüsselangriff möglich. Die derzeit bekanntesten Angriffe erlauben es nicht, das gesamte AES auf diese Weise zu brechen, aber sie wurden im Laufe der Zeit immer besser - erst letzte Woche wurde ein neuer Angriff veröffentlicht, der 13 Runden (von insgesamt 14) AES-256 mit bricht ein verwandter Schlüsselangriff. Es wäre zutiefst unklug, sich darauf zu verlassen, dass solche Angriffe mit der Zeit nicht besser werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.