Я хочу реализовать самую безопасную, и самую надежную форму криптографии симметричного ключа в моем приложении. Пользователь должен ввести пароль для шифрования/дешифрования, и это - все. Для RijndaelManaged нужно ввести ключ и IV. Я не уверен, как обратиться к ситуации. Прямо сейчас у меня есть введенный пароль, хешируемый SHA256 и затем используемый в качестве ключа для Rijndael. Что я использую для IV? Другой пароль?
Вы можете использовать GenerateIV
(переопределено в RijndaelManaged
) для генерации IV. Затем вы можете передать IV вместе с шифротекстом. Вы можете думать о IV как о чем-то вроде соли - по сути, он предотвращает каждый раз шифрование одного и того же открытого текста в один и тот же зашифрованный текст. Не используйте IV повторно - это делает его бессмысленным. Создавайте новый для каждого сообщения.
Есть специальная функция для получения ключа из пароля, я считаю, что это безопаснее, чем хэш. Вы можете поискать класс Rfc2898DeriveBytes. Для него нужны соль
и пароль.
Принятой практикой является добавление IV (и соли) в незашифрованном виде в сообщение.
Если вы создадите экземпляр класса Rijndaal, он автоматически сгенерирует IV, отправитель может просто использовать его.
Jon Skeet прав насчет IV, но у вас также есть проблема с тем, как вы выводите ключ.
Просто использование одного раунда SHA256 для пароля с открытым текстом небезопасно. Это оставляет систему открытой для простой атаки по словарю.
Существует класс функций, предназначенных для получения открытого пароля и создания из него ключа шифрования - это "функции получения ключа". Вы должны использовать одну из них - PBKDF2 является хорошим выбором - для генерации вашего ключа. Класс Rfc2898DeriveBytes
реализует PBKDF2.
Для KDF потребуется соль, которая генерируется каждый раз случайным образом и включается вместе с текстом шифра (как и IV).