2013-06-19 5 views
5

Kennt jemand eine Möglichkeit, einen 256-Bit-Schlüsselwert zu erhalten, der aus einer Passphrase beliebiger Länge generiert wird? Die Verschlüsselung kann nicht gesalzen werden, da die verschlüsselten Werte erneut generiert und in der Datenbank verglichen werden müssen. Daher muss ein Wert bei jeder Verschlüsselung die gleiche verschlüsselte Zeichenfolge generieren.Generierung AES 256 Bit Schlüsselwert

Momentan verwende ich einen 32-Zeichen-Schlüssel, der an der möglicherweise falschen Annahme arbeitet, dass dies 256 Bits sind?

Also, würde ich wollen, dass der schnelle braune Fuchs zu einem geeigneten AES 256-Bit-Schlüssel umgewandelt wird?

+2

"Die Verschlüsselung kann nicht gesalzen werden, da die verschlüsselten Werte erneut generiert werden müssen." Daher ist es üblich, das Salz zusammen mit dem Hash-Passwort zu speichern. Wenn zwei verschiedene Benutzer dasselbe Kennwort verwenden, werden auf diese Weise unterschiedliche Hashwerte erstellt. Bei einem einzelnen Benutzer wird jedoch immer dasselbe Kennwort für denselben Benutzer erstellt. – svick

+0

um ehrlich zu sein, ohne das Salz ist es überhaupt nicht wirklich verschlüsselt. Es sollte nicht möglich sein, eine direkte Datenbanksuche nach einem verschlüsselten Wert durchzuführen. – Matthew

Antwort

12

Sie können die Rfc2898DeriveBytes Class mit einem beliebigen Größe Passwort konstruieren und leiten dann einen Schlüssel für die gewünschte Größe in diesem Fall 256 Bits (32 Bytes):

private static byte[] CreateKey(string password, int keyBytes = 32) 
{ 
    const int Iterations = 300; 
    var keyGenerator = new Rfc2898DeriveBytes(password, Salt, Iterations); 
    return keyGenerator.GetBytes(keyBytes); 
} 

Um eine deterministische Ausgabe zu erzeugen (dh Die gleiche Eingabe erzeugt die gleiche Ausgabe. Sie müssen das Salz fest codieren. Das Salz muss mindestens 8 Bytes:

private static readonly byte[] Salt = 
    new byte[] { 10, 20, 30 , 40, 50, 60, 70, 80}; 
+0

Siehe meine Erklärung für eine eher theoretische Beschreibung von oben. Beachten Sie, dass "Rfc2898DeriveBytes" PBKDF2 implementiert :) –

+0

Vielen Dank - das war sehr hilfreich. Sollte keySize jedoch 32 sein, um ein 32-Byte-Schlüssel-Array zu erhalten? – bhs

+0

Ja, ich denke das war ein kleiner Fehler von ByteBlast. Ich rate Ihnen auch, das Kennwort in Bytes zu kodieren, die UTF-8-Codierung verwenden, da die Funktion Rfc2898DeriveBytes die Codierung, die es verwendet, nicht explizit angibt. Das ist schwierig, wenn Sie die Funktion von einer anderen Laufzeitumgebung verwenden. –

-1

Sie können eine Hash-Funktion verwenden, die einen 256-Bit-Ausgang von beliebigen Eingängen bietet, z. B. SHA256.

+1

Offiziell ist ein Hash keine passwortbasierte Schlüsselableitungsfunktion und sollte nicht direkt als solche verwendet werden. –

2

wahrscheinlich der beste Weg PBKDF2 Verwendung SHA256 zu verwenden ist (die 256-Bit-Ausgabe erzeugen wird) und ein anwendungsspezifischen Salz & Iterationszählwert. Sie sollten sich bewusst sein, dass die Verwendung eines anwendungsspezifischen Salzes den Schutz vor PBKDF2 erheblich reduziert hat. Daher benötigen Sie möglicherweise zusätzlichen Schutz, um dieses Problem zu beheben. Eine Methode wäre, sicherzustellen, dass die Datenbank sicher ist und dass eine maximale Anzahl von Versuchen verwendet werden kann.

Sie haben richtigerweise festgelegt, dass eine 32 Char-Passphrase kein 256-Bit-Schlüssel ist. Es enthält nicht genug Entropie und einige Bytes haben möglicherweise nicht einmal gültige Zeichendarstellungen.

+0

Siehe ByteBlast-Antwort für eine Implementierung von oben :) –

+0

Danke - also ein 32-Byte-Array von der oben genannten Methode ist ein 256-Bit-Schlüssel? – bhs

+0

Es ist eine passwortbasierte Schlüsselableitungsfunktion, das ist PBKDF. Du stellst ein Passwort ein, du bekommst einen Schlüssel zurück (als Bytes). Es hat Schutz mit einem Salz und einer Anzahl von Iterationen, was es relativ schwierig macht, den Schlüssel zu berechnen (sowohl für Sie als auch für einen Angreifer). Ein Angreifer muss wahrscheinlich eine Menge von ihnen tun, um an den Schlüssel zu gelangen. Es ist jedoch am besten, SHA-256 oder höher zu verwenden, da es erforderlich ist, die gesamte Anzahl von Iterationen für alles über einer Hash-Ausgabe durchzuführen - und das ist wahrscheinlich nur ein Fehler für Sie und kein Angreifer. –