PasswordDeriveBytes vs Rfc2898DeriveBytes, устаревший, но более быстрый
Я работаю над функциональностью шифрования на основе классов, унаследованных от SymmetricAlgorithm, таких как TripleDes, DES и т. д.
в основном есть два варианта для генерации согласованного ключа и IV для моего класса алгоритмов,PasswordDeriveBytes
и Rfc2898DeriveBytes
, оба наследуются от абстрактного класса DeriveBytes.
на PasswordDeriveBytes.GetBytes()
метод помечены как устаревшие .Чистая рамок пока Rfc2898DeriveBytes.GetBytes () рекомендуется, так как он соответствует стандарту PBKDF2. Однако, основанный на моем тестирование, вызов же GetBytes()
метод в классе Rfc2898DeriveBytes почти в 15 раз медленнее, чем в PasswordDeriveBytes
класс, что приводит к неожиданному использованию ЦП (всегда выше 50%).
вот некоторые данные испытаний:
- итераций: 100
- тип алгоритма: DES
- оригинальный текст: "я тестовый ключ, зашифруйте меня, пожалуйста"
- время:
- PasswordDeriveBytes: 99ms
- Rfc2898DeriveBytes: 1,373 МС
на основе тестирования, плохая производительность Rfc2898DeriveBytes
не приемлемо в производственных условиях.
кто-нибудь заметил эту проблему раньше? Любое решение я все еще могу использовать стандартный, не задев производительность? Любой риск использовать устаревший метод (может быть удален в будущей версии)?
Спасибо, ребята!
Edit:
вероятно, я нашел, где проблема... Этот число итераций по умолчанию для PasswordDeriveBytes
равен 100, в то время как для Rfc2898DeriveBytes
- это 1000. После того, как я изменил их на то же число, что и 1000, выполнив Rfc2898DeriveBytes
только два раза.
3 ответов
в этом блоге говорится о различиях между ними: http://blogs.msdn.com/shawnfa/archive/2004/04/14/generating-a-key-from-a-password.aspx
Это не одно и то же.
Rfc2898DeriveBytes является реализацией PBKDF2. PasswordDeriveBytes-это реализация PBKDF1. PBKDF2 генерирует другой выход, используя другой метод, и гораздо большее количество раундов, чем PBKDF1.
функции хэширования паролей, такие как эти, которые используются для вывода ключей, должны быть медленными. В том - то и дело-их гораздо труднее взломать.
эти две функции не совместимость и PasswordDeriveBytes не так безопасны.
Я думаю, что вам не хватает точки derivebytes. Он должен быть медленным. Он намеренно использует медленный алгоритм, который не может быть ускорен умным трюком. Типичный параметр "количество итераций" должен находиться в диапазоне 2^16-2^20 и вводить 0,1-0,5 секунды задержки между вводом пароля пользователем и генерируется ключ. Цель состоит в том, чтобы защитить от слабых паролей, выбранных "ленивыми невежественными пользователями", и замедлить поиск грубой силы.