.NET: Unterschied zwischen PasswordDeriveBytes und Rfc2898DeriveBytes

8

Ich versuche einen C # -Code zu verstehen, den ich bekommen habe, der sich mit Kryptographie beschäftigt und speziell PasswordDeriveBytes von System.Security.Cryptography verwendet.

In der .NET-Dokumentation heißt es, dass PasswordDeriveBytes verwendet "eine Erweiterung des PBKDF1-Algorithmus", die später im Dokument als "der PKCS # 5 v2.0-Standard" angegeben ist, was PBKDF2 ist (soweit ich das beurteilen kann). Überall im Netz, das ich gefunden habe (einschließlich hier bei Stack Exchange), sagt jeder, "benutze Rfc2898DeriveBytes, weil Password * veraltet ist und PBKDF1 benutzt". Aber der einzige Unterschied in den Dokumenten bei msdn.microsoft.com scheint zu sein, dass die Rfc * -Version PBKDF2 speziell erwähnt, wo Password * sagt "Erweiterung von PBKDF1" und "PKCS # 5 v 2.0".

Kann mir also irgendjemand sagen, was der Unterschied zwischen den beiden Klassen ist (wenn überhaupt) und warum sollte ich einen statt den anderen für die PBKDF2-Passwortschlüsselableitung verwenden?

Nun verwendet anderer Code, der sich mit den gleichen Daten beschäftigt, explizit PBKDF2 und funktioniert, so dass in der Tat PasswordDeriveBytes auch PBKDF2 verwendet, oder dass PBKDF2 unter bestimmten Umständen einfach mit PBKDF1 kompatibel ist, aber ich möchte um sicher zu sein, dass es nicht irgendein Nebeneffekt irgendeiner zufälligen Sache ist, und dass Dinge nur magisch funktionieren (und schließlich wahrscheinlich magisch und spektakulär brechen werden), ohne dass irgendjemand wirklich warum versteht.

    
adamski 17.08.2011, 12:42
quelle

4 Antworten

1

Hier ist ein Blogbeitrag, der die Unterschiede beschreibt:

Ссылка

PBKDF2 kann verwendet werden, um Schlüssel beliebiger Länge zu generieren, was sehr nützlich für die passwortbasierte Verschlüsselung ist (es kann jede Schlüssellänge wie von der symmetrischen Chiffre benötigt), aber weniger für sicheres Passwort bedeuten Lager. Es verwendet auch das Salz unter Verwendung von HMAC anstelle von Verkettungen wie PBKDF1, das im Falle schwacher Salze bessere Sicherheitseigenschaften aufweist.

    
orip 17.08.2011 18:58
quelle
1

Ich denke, dass eine großartige Antwort hier gefunden werden würde:

C # PasswordDeriveBytes Confusion

Aber um es zusammenzufassen:

Microsofts Implementierung des ursprünglichen PKCS # 5 (aka PBKDF1) enthält unsichere Erweiterungen, um mehr Bytes zur Verfügung zu stellen, als die Hash-Funktion bereitstellen kann (siehe Fehlerberichte hier und hier).

Auch wenn es nicht fehlerbehaftet ist, sollten Sie undokumentierte, proprietäre Erweiterungen von Standards vermeiden (oder Sie könnten Ihre Daten in Zukunft möglicherweise nicht entschlüsseln - zumindest nicht außerhalb von Windows).

Ich empfehle Ihnen dringend, das neuere Rfc2898DeriveBytes zu verwenden, das PBKDF2 (PKCS # 5 v2) implementiert, das seit .NET 2.0 verfügbar ist.

    
Richard 30.01.2015 13:57
quelle
1

Wenn Sie PasswordDeriveBytes instanziieren und einen einzelnen Aufruf an die Methode GetBytes senden, die einen Wert übergibt, der kleiner ist als die Ausgabegröße des zugrunde liegenden Digest-Algorithmus, erhalten Sie einen Wert von PBKDF1 -Algorithmus.

Wenn Sie GetBytes für das gleiche Objekt zweimal aufrufen, können Sie einen Zählfehler in der Implementierung feststellen.

PBKDF1 wird nur beschrieben, um bis zur Größe des Hash-Algorithmus auszugeben (z. B. 20 Bytes für SHA-1), aber die PasswordDeriveBytes-Klasse hat eine Formel zur Unterstützung der bis zu 1000-fachen Hash-Ausgabegröße gebildet. Ein großer Wert, der von dieser Klasse erzeugt wird, kann auf einer anderen Plattform nicht einfach erreicht werden.

Wenn Sie Rfc2898DeriveBytes instanziieren, erhalten Sie eine Streaming-Implementierung des PBKDF2 -Algorithmus. Der offensichtlichste Unterschied von PBKDF2 gegenüber PBKDF1 ist, dass PBKDF2 die Erzeugung einer beliebigen Datenmenge erlaubt (die Grenze ist (2^32-1)*hashOutputSize ; oder für SHA-1 85.899.345.900 Bytes). PBKDF2 verwendet auch eine komplexere Konstruktion (insbesondere HMAC gegenüber direktem Digest), um das Wiederherstellen des Eingabe-Passworts von einem Ausgabewert schwieriger zu machen.

Das "Streaming" in der Implementierung ist, dass die Verkettung von GetBytes(5) und GetBytes(3) identisch ist mit GetBytes(8) . Im Gegensatz zu PasswordDeriveBytes funktioniert das in Rfc2898DeriveBytes ordnungsgemäß.

PBKDF1 wurde ursprünglich zum Generieren von DES-Schlüsseln erstellt, die in PKCS # 5 v1.5 1993. PBKDF2 wurde im Jahr 1999 in PKCS # 5 v2.0 veröffentlicht (das 1999 als RFC2898 ) veröffentlicht wurde. Ein Slide-Deck, das sein sollte gefunden unter ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/ pkcs5v2-0.pdf (scheint aber Probleme zu haben, also ftp://ftp.dfn-cert.de/pub/pca/docs/PKCS/ftp.rsa.com/99workshop/pkcs5_v2.0.ppt kann noch weiter tun fasst Unterschiede zusammen. (Die Folie wurde von RSA Security, den Machern von PBKDF1 und PBKDF2, geschrieben und sie sind diejenigen, die PBKDF2 gegenüber PBKDF1 empfehlen).

    
bartonjs 12.06.2017 17:37
quelle
0

PKCS # 5 v2.0 definiert sowohl PBKDF1 als auch PBKDF2, ersteres aus Gründen der Abwärtskompatibilität und < em> auch empfiehlt, PBKDF2 für neue Anwendungen zu verwenden. Ich habe keine Ahnung, warum letzteres besser ist als das erste, aber die beiden .NET-Klassen scheinen unterschiedliche, aber interoperable Algorithmen zu verwenden. (Möglicherweise weil nur der resultierende Schlüssel ausgetauscht wird, nicht die Eingänge + KDF.)

    
millimoose 17.08.2011 15:06
quelle

Tags und Links