Czy można użyć skrótu SHA1 hasła jako soli podczas uzyskiwania klucza szyfrowania i IV z ciągu hasła?

używamRfc2898DeriveBytes aby bezpiecznie wygenerować klucz szyfrowania i wektor inicjujący z hasła użytkownika dostarczonego przez użytkownika, do użycia z szyfrowaniem symetrycznym (np. AesManaged).

Biorę skrót SHA1 hasła jako parametr soli doRfc2898DeriveBytes. Czy to w porządku? Jeśli nie, to skąd wziąć sól? Będę potrzebował tej samej soli podczas odszyfrowywania, prawda? Muszę więc przechowywać go w postaci niezaszyfrowanej - niezabezpieczonej. Jeśli muszę go bezpiecznie przechowywać, to staje się on kolejnym „hasłem”, prawda?

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);
}

Widziałem używanie stałej (zakodowanej na stałe) soli i widziałem ludzi narzekających na to. Pomyślałem, że wyprowadzenie soli z hasła będzie lepszym pomysłem, ale nie jestem pewien, czy jest to optymalne rozwiązanie.

Wkrótce mam plik, który musi być zaszyfrowany, a hasło wpisane przez użytkownika. Jak właściwie używaćRfc2898DeriveBytes uzyskać bezpieczny klucz szyfrowania i IV?

Dzięki.

EDYTOWAĆ:

Dziękuję za odpowiedzi. Teraz rozumiem, że głównym (być może jedynym) celem soli jest uniemożliwienie generowania tablic tęczowych - nie można wstępnie wygenerować skrótu „P @ $ w0rd”, ponieważ będzie on miał inny skrót dla każdego możliwego wartość soli. Rozumiem to doskonale, ALE ... Czy to naprawdę ma znaczenie dla szyfrowania symetrycznego? Nigdzie nie przechowuję hasha? Więc nawet jeśli atakujący ma tęczową tabelę dla wszystkich możliwych kombinacji haseł, nie może zrobić wiele, prawda?

Tak więc moje pytanie brzmi: czy istnieje jakakolwiek korzyść z używania losowej soli w każdej operacji szyfrowania, w porównaniu z użyciem soli pochodzącej z hasła (lub nawet zakodowanej),w przypadku korzystania z algorytmów szyfrowania symetrycznego (jak AesManaged z .NET)?

questionAnswers(5)

yourAnswerToTheQuestion