Ist es in Ordnung, den SHA1-Hash des Kennworts als Salt zu verwenden, wenn der Verschlüsselungsschlüssel und die IV aus der Kennwortzeichenfolge abgeleitet werden?

Ich benutzeRfc2898DeriveBytes zum sicheren Erzeugen eines Verschlüsselungsschlüssels und eines Initialisierungsvektors aus einem vom Benutzer angegebenen Zeichenfolgenkennwort zur Verwendung mit symmetrischer Verschlüsselung (z. B. AesManaged).

Ich nehme den SHA1-Hash von Passwort als Salt-Parameter anRfc2898DeriveBytes. Ist das in Ordnung? Wenn nicht, woher soll ich dann das Salz nehmen? Ich brauche das gleiche Salz zum Entschlüsseln, oder? Also muss ich es unverschlüsselt aufbewahren - ungesichert. Wenn ich es sicher aufbewahren muss, wird es einfach ein anderes "Passwort", nicht wahr?

void SecureDeriveKeyAndIvFromPassword(string password, int iterations, 
    int keySize, int ivSize, out byte[] key, out byte[] iv)
{
    // Generate the salt from password:

    byte[] salt = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(password));

    // Derive key and IV bytes from password:

    Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, salt, iterations);

    key = derivedBytes.GetBytes(keySize);
    iv = derivedBytes.GetBytes(ivSize);
}

Ich habe gesehen, wie man das beständige (hartcodierte) Salz verwendet, und ich habe Leute gesehen, die sich darüber beschwert haben. Ich dachte, Salz vom Passwort abzuleiten, wäre die bessere Idee, aber ich bin mir nicht sicher, ob dies eine optimale Lösung ist.

In Kürze habe ich eine Datei, die verschlüsselt werden muss, und eine vom Benutzer eingegebene Kennwortzeichenfolge. Wie verwende ich das richtig?Rfc2898DeriveBytes sichere Verschlüsselungsschlüssel und IV abzuleiten?

Vielen Dank.

BEARBEITEN:

Danke für deine Antworten. Ich verstehe jetzt, dass der Hauptzweck (vielleicht nur?) Von Salt darin besteht, das Generieren von Regenbogentabellen unmöglich zu machen - Sie können den Hash von "P @ $ w0rd" nicht vorgenerieren, da es für jeden möglichen einen anderen Hash gibt Salzwert. Ich verstehe das perfekt, ABER ... Ist das wirklich relevant für die symmetrische Verschlüsselung? Ich speichere den Hash nirgendwo richtig? Selbst wenn der Angreifer die Regenbogentabelle für alle möglichen Kennwortkombinationen hat, kann er nicht viel tun, oder?

Meine Frage lautet nun also: Gibt es einen Vorteil der Verwendung des Zufallssalzes bei jedem Verschlüsselungsvorgang im Vergleich zur Verwendung von durch ein Passwort abgeleitetem (oder sogar hartcodiertem) Salz?bei Verwendung mit symmetrischen Verschlüsselungsalgorithmen (wie AesManaged von .NET)?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage