Можно ли использовать SHA1-хэш пароля в качестве соли при получении ключа шифрования и IV из строки пароля?
м используюRfc2898DeriveBytes
для безопасного генерирования ключа шифрования и вектора инициализации из предоставленного пользователем строкового пароля для использования с симметричным шифрованием (например, AesManaged) .I '
м взяв хэш пароля 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?
Благодарю.
РЕДАКТИРОВАТЬ:
Спасибо за ваши ответы. Теперь я понимаю, что основная (может быть, только?) Цель соли - сделать создание радужных таблиц невозможным - вы можетепредварительно сгенерировать хеш "P @ $ w0rd» потому что он будет иметь разные хэш для каждого возможного значения соли. Я прекрасно понимаю, НО ... Это действительно имеет отношение к симметричному шифрованию? Я'm не хранит хэш где-нибудь правильно? Поэтому, даже если у злоумышленника есть радужная таблица для всех возможных комбинаций паролей, он может:много делаю, верно?
Итак, мой вопрос теперь таков: есть ли преимущество использования случайной соли в каждой операции шифрования по сравнению с использованием соли, полученной из пароля (или даже жестко закодированной),при использовании с симметричными алгоритмами шифрования (как AesManaged из .NET)?