Можно ли использовать 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)?