Можно ли использовать SHA1-хэш пароля в качестве соли при получении ключа шифрования и IV из строки пароля?

Я используюRfc2898DeriveBytes надежно генерировать ключ шифрования и вектор инициализации из предоставленного пользователем строкового пароля для использования с симметричным шифрованием (например, AesManaged).

Я принимаю хэш пароля SHA1 в качестве солт-параметра дляRfc2898DeriveBytes, Это нормально? Если нет, то откуда мне взять соль? Мне понадобится та же соль при расшифровке, верно? Поэтому я должен хранить его где-нибудь в незашифрованном виде - без обеспечения. Если мне нужно надежно сохранить его, он просто станет другим «паролем», не так ли?

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

Я видел использование постоянной (жестко закодированной) соли, и я видел людей, жалующихся на это. Я думал, что получение соли из пароля было бы лучшей идеей, но я не уверен, что это оптимальное решение.

Вскоре у меня есть файл, который необходимо зашифровать, и ввод пароля пользователем. Как правильно использоватьRfc2898DeriveBytes получить безопасный ключ шифрования и IV?

Благодарю.

EDIT:

Спасибо за ваши ответы. Теперь я понимаю, что основная (может быть, только?) Цель соли - сделать генерацию радужных таблиц невозможной - вы не можете предварительно сгенерировать хеш & quot; P @ $$ w0rd & quot; потому что он будет иметь разные хэш для каждого возможного значения соли. Я прекрасно понимаю, НО ... Это действительно имеет отношение к симметричному шифрованию? Я не храню хэш где-нибудь, верно? Таким образом, даже если у злоумышленника есть радужная таблица для всех возможных комбинаций паролей, он не может многое сделать, верно?

Итак, мой вопрос теперь таков: есть ли преимущество использования случайной соли в каждой операции шифрования по сравнению с использованием соли, полученной из пароля (или даже жестко закодированной),when used with symmetric encryption algorithms (как AesManaged из .NET)?

Ответы на вопрос(5)

Ваш ответ на вопрос