PasswordDeriveBytes vs Rfc2898DeriveBytes, Przestarzałe, ale szybsze
Pracuję nad funkcją szyfrowania opartą na klasach odziedziczonych po SymmetricAlgorithm, takich jak TripleDes, DES itd.
Zasadniczo istnieją dwie opcje generowania spójnego klucza i IV dla mojej klasy algorytmu,PasswordDeriveBytes
iRfc2898DeriveBytes
, obie dziedziczą po klasie abstrakcyjnej DeriveBytes.
ThePasswordDeriveBytes.GetBytes()
metoda jest oznaczona jako przestarzała w środowisku .NET, podczas gdy Rfc2898DeriveBytes.GetBytes () jest zalecany, ponieważ jest zgodny ze standardem PBKDF2. Jednak na podstawie moich testów, dzwoniąc tak samoGetBytes()
metoda w klasie Rfc2898DeriveBytes jest prawie 15 razy wolniejsza niż wPasswordDeriveBytes
klasa, co prowadzi do nieoczekiwanego użycia procesora (zawsze powyżej 50%).
Oto kilka danych testowych:
Iteracje: 100Typ algorytmu: DESOryginalny tekst: „Jestem kluczem testowym, zaszyfruj mnie”Czas:PasswordDeriveBytes: 99msRfc2898DeriveBytes: 1337 msNa podstawie testów zła wydajnośćRfc2898DeriveBytes
jest niedopuszczalny w środowisku produkcyjnym.
Czy ktoś wcześniej zauważył ten problem? Jakiekolwiek rozwiązanie, które wciąż mogę użyć standardowego bez uderzenia w wydajność? Jakiekolwiek ryzyko użycia przestarzałej metody (może zostać usunięte w przyszłej wersji)?
Dzięki chłopaki!
Edytować:
Prawdopodobnie znalazłem, gdzie jest problem ... Domyślny numer licznika iteracji dlaPasswordDeriveBytes
wynosi 100, podczas gdy dlaRfc2898DeriveBytes
wynosi 1000. Po zmianie ich na tę samą liczbę co 1000, wykonywanieRfc2898DeriveBytes
jest tylko podwójny.