Je travaille sur une fonctionnalité de chiffrement basé sur les classes héritées de SymmetricAlgorithm tels que TRIPLEDES, DES, etc.PasswordDeriveBytes vs Rfc2898DeriveBytes, obsolète, mais de façon plus rapide
Fondamentalement, il sont deux options pour générer la clé cohérente et IV ma classe d'algorithme, PasswordDeriveBytes
et Rfc2898DeriveBytes
, héritent tous les deux de la classe abstraite DeriveBytes.
La méthode PasswordDeriveBytes.GetBytes()
est marquée comme obsolète dans le framework .NET alors que Rfc2898DeriveBytes.GetBytes() est recommandée car elle correspond à la norme PBKDF2. Cependant, en fonction de mes tests, l'appel de la même méthode GetBytes()
dans la classe Rfc2898DeriveBytes est presque 15 fois plus lent que celui de la classe PasswordDeriveBytes
, ce qui entraîne une utilisation inattendue du processeur (toujours supérieure à 50%).
certaines données Here're test:
- : 100 Iterations
- Type algorithme: DES
- Texte original: "Je suis une clé de test, me chiffrer s'il vous plaît"
- Heure:
- PasswordDeriveBytes: 99ms
- Rfc2898DeriveBytes: 1,373ms
D'après les tests, la mauvaise performance de Rfc2898DeriveBytes
n'est pas acceptable dans un environnement de production.
Quelqu'un a-t-il déjà remarqué ce problème? Toute solution que je peux encore utiliser un standard sans atteindre la performance? Risque d'utiliser une méthode obsolète (pourrait être supprimé dans la future version)?
Merci les gars!
Edit:
Probablement que je trouve où le problème est ... Le nombre de comptage par défaut itération pour PasswordDeriveBytes
est de 100, alors que pour Rfc2898DeriveBytes
est 1000. Après avoir changé les au même numéro que 1000, l'exécution Rfc2898DeriveBytes
est seulement le double temps.
À quelle fréquence allez-vous dériver des clés dans un environnement de production? Et, en ce qui concerne vos données de synchronisation, lorsque vous avez dit "100 itérations" - est-ce itérations sur la clé onee, ou avez-vous généré 100 clés. Toutes les données de performance basées sur 100 essais sont suspectes, mais je pense que vous avez effectivement testé un essai. Comme dans tous les cas d'analyse de performances, il est tout simplement inapproprié de tirer des conclusions sur les performances du serveur en fonction du temps de réponse d'un seul essai. – Cheeso
@Cheeso Le test était juste un test unitaire de la performance pour ces deux classes et il n'a pas été fait dans une vraie application. Les "100 itérations" que j'ai mentionnées étaient un peu confuses, cela signifie seulement que j'ai exécuté chacune d'elles 100 fois. Ce n'est pas un vrai test de perf, mais juste une comparaison. – tshao
Je pense que vous avez peut-être manqué le point 'Rfc2898DeriveBytes' est fondamentalement _designed_ pour être lent afin que les vérifications de hachage de mot de passe (faites par ouverture de session et donc assez rarement) ne remarquent pas la performance touchée par les attaques par force brute. Si vous avez besoin de générer des hachages, 'Rfc2898DeriveBytes' n'est pas pour vous, mais si vous avez besoin d'une certaine sécurité des attaques par force brute, c'est. – Keith