Ist BCrypt ein guter Hashing-Algorithmus für C #? Wo kann ich es finden? [geschlossen]

129

Ich habe gelesen, dass viele Programmierer beim Hashing eines Passworts die Verwendung des BCrypt-Algorithmus empfehlen.

Ich programmiere in C # und frage mich, ob jemand eine gute Implementierung für BCrypt kennt? Ich habe diese Seite gefunden , aber ich weiß nicht wirklich, ob es sich um eine Fälschung handelt oder nicht.

Was muss ich bei der Auswahl eines Passwort-Hashing-Schemas beachten? Ist BCrypt eine "gute" Implementierung?

Svish
quelle

Antworten:

148

Zunächst einige wichtige Begriffe:

Hashing - Der Vorgang, bei dem eine Zeichenfolge genommen und eine Folge von Zeichen erzeugt wird, die nicht auf die ursprüngliche Zeichenfolge zurückgesetzt werden kann.

Symmetrische Verschlüsselung - (Regel nur bezeichnet als ‚Verschlüsselung‘) - der Akt der eine Zeichenfolgenehmen und eine Folge von Zeichen erzeugendie kann auf die ursprüngliche Zeichenfolge durch die Verwendung des gleichen Verschlüsselungsschlüssel entschlüsselt werdendie es verschlüsselt.

Rainbow Table - Eine Nachschlagetabelle, die alle Variationen von Zeichen enthält, die in einem bestimmten Hashing-Algorithmus gehasht wurden.

Salz - eine bekannte zufällige Zeichenfolge, die an die ursprüngliche Zeichenfolge angehängt wird, bevor sie gehasht wird.

Für .NET Framework verfügt Bcrypt noch nicht über eine verifizierte Referenzimplementierung. Dies ist wichtig, da nicht festgestellt werden kann, ob eine vorhandene Implementierung schwerwiegende Fehler aufweist. Eine Implementierung von BCrypt für .NET erhalten Sie hier . Ich weiß nicht genug über Kryptographie, um zu sagen, ob es sich um eine gute oder eine schlechte Implementierung handelt. Kryptographie ist ein sehr tiefes Feld. Versuchen Sie nicht, einen eigenen Verschlüsselungsalgorithmus zu erstellen . Ernsthaft.

Wenn Sie Ihre eigene Passwortsicherheit implementieren möchten (Seufzer), müssen Sie verschiedene Dinge tun:

  1. Verwenden Sie einen relativ sicheren Hash-Algorithmus .
  2. Salt jedes Passwort, bevor es gehasht wird.
  3. Verwenden Sie für jedes Passwort ein eindeutiges und langes Salz und speichern Sie das Salz mit dem Passwort.
  4. Benötigen Sie sichere Passwörter .

Selbst wenn Sie dies alles tun, könnte ein entschlossener Hacker möglicherweise immer noch die Passwörter herausfinden, es würde nur sehr lange dauern. Das ist dein Hauptfeind: Zeit .

Der bcrypt-Algorithmus funktioniert, da das Hashing eines Kennworts fünf Größenordnungen länger dauert als bei MD5 . (und immer noch viel länger als AES oder SHA-512). Dies zwingt den Hacker dazu, viel mehr Zeit damit zu verbringen, eine Regenbogentabelle zum Nachschlagen Ihrer Passwörter zu erstellen, wodurch die Wahrscheinlichkeit, dass Ihre Passwörter gehackt werden, weitaus geringer ist.

Wenn Sie Ihre Passwörter salzen und hashen und jedes Salz anders ist, müsste ein potenzieller Hacker eine Regenbogentabelle für jede Salzvariante erstellen , nur um eine Regenbogentabelle für ein gesalzenes + gehashtes Passwort zu haben. Das bedeutet, wenn Sie 1 Million Benutzer haben, muss ein Hacker 1 Million Regenbogentabellen generieren. Wenn Sie für jeden Benutzer das gleiche Salz verwenden, muss der Hacker nur 1 Regenbogentabelle generieren, um Ihr System erfolgreich zu hacken.

Wenn Sie Ihre Passwörter nicht salzen, muss ein Angreifer lediglich für jede Implementierung (AES, SHA-512, MD5) eine vorhandene Rainbow-Tabelle aufrufen und prüfen, ob eine mit dem Hash übereinstimmt. Dies wurde bereits getan , ein Angreifer muss diese Regenbogentabellen nicht selbst berechnen .

Trotz alledem müssen Sie gute Sicherheitspraktiken anwenden . Wenn sie erfolgreich einen anderen Angriffsvektor verwenden können (XSS, SQL Injection, CSRF, et al. ) Auf Ihrer Website, tut gutes Passwort Sicherheit Angelegenheit nicht. Das klingt nach einer kontroversen Aussage, aber denken Sie darüber nach: Wenn ich alle Ihre Benutzerinformationen durch einen SQL-Injection-Angriff erhalten kann oder Ihre Benutzer dazu bringen können, mir ihre Cookies über XSS zu geben, spielt es keine Rolle, wie gut Ihr Passwort ist Sicherheit ist .

Andere Ressourcen:

  1. Jeff Atwood: Vereinfachte .NET-Verschlüsselung (ideal für einen Überblick über das Hashing)
  2. Jeff Atwood: Ich habe mich gerade als Sie angemeldet
  3. Jeff Atwood: Sie speichern Passwörter wahrscheinlich falsch
  4. Jeff Atwood: Speed ​​Hashing

Hinweis: Bitte empfehlen Sie andere gute Ressourcen. Ich muss ein Dutzend Artikel von Dutzenden von Autoren gelesen haben, aber nur wenige schreiben so deutlich zu diesem Thema wie Jeff. Bitte bearbeiten Sie die Artikel so, wie Sie sie finden.

George Stocker
quelle
Vielleicht fügen Sie Ihrem Salz Absatz hinzu, dass ein Salz zufällig ausgewählt werden muss
Jacco
2
@Jacco Guter Anruf, hinzugefügt. Obwohl das nicht so wichtig ist. Sie können einfach den Zeitstempel des Logins für das Salz verwenden. Der Unterschied besteht darin, dass der Angreifer dann die Regenbogentabelle für jedes Salz neu berechnen muss. Das macht es schwierig, nicht dass es zufällig ausgewählt wird. Wenn Sie es zufällig machen, wird eine weitere Ebene der Verschleierung hinzugefügt, aber das ist nutzlos, sobald der Angreifer Ihre Datenbank sehen kann (was das Problem ist, das in erster Linie all unseren Kummer verursacht).
George Stocker
3
Nicht wirklich, das Salz muss nicht geheim sein, sondern für jeden Fall einzigartig. Da Unikate (wie weltweit) nicht möglich sind, ist Zufall das nächstbeste. Außerdem ist der Zeitstempel kein gutes Salz, da nicht genügend Entropie vorhanden ist.
Jacco
7
Ich würde Ihre Aussage in Frage stellen: "Wenn sie XSS oder SQL Injection erfolgreich verwenden können, spielt eine gute Kennwortsicherheit keine Rolle." Im Gegenteil, wenn sie Ihre Site erfolgreich mit XSS oder SQL injizieren können, ist eine gute Kennwortsicherheit noch wichtiger. Der Schlüssel hier ist "Tiefenverteidigung" - Sie sollten die Sicherheit so weit wie möglich auf jeder Ebene Ihrer Anwendung erhöhen.
Jammycakes
2
@jammycakes Absolut; Mein Punkt war verloren: Sie können nicht einfach sagen: "Hey, wir haben unsere Passwörter gehasht und gesalzen," wir sind in Ordnung "!"
George Stocker
74

Sie dürfen BCrypt in .NET nicht verwenden . Sie müssen PBKDF2 wie bei der integrierten .NET Framework-Implementierung verwenden. Es ist die einzige frei verfügbare kryptografisch verifizierte Implementierung in .NET und der von NIST empfohlene Algorithmus .

StackId hat zuvor BCrypt verwendet und aus genau diesem Grund zu PBKDF2 verschoben:

Für Neugierige haben wir Passwörter mit PBKDF2. Relavent-Code ist hier ( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135 ) über einige Indirektionsebenen verfügbar . In einer früheren Iteration haben wir BCrypt verwendet. wurde jedoch zu PBKDF2 verschoben, da es in das .NET-Framework integriert ist, während BCrypt die Überprüfung einer Implementierung erfordern würde (kein kleines Unternehmen).

Kevin Montrose, 27. Mai 2011

(Aktualisierter Link auf GitHub)

Bearbeiten: Die Bedeutung von verifiziert in kryptografischen Begriffen scheint nicht ohne weiteres verstanden zu werden. Eine verifizierte Implementierung bedeutet, dass kryptografisch nachgewiesen wurde, dass sie fehlerfrei implementiert wurde. Die Kosten hierfür können leicht 20.000 USD oder mehr erreichen. Ich erinnere mich daran, als ich über OpenSSL recherchierte und las, wo angegeben wurde, dass sie nicht den gesamten Überprüfungsprozess abgeschlossen haben, aber wenn Sie vollständig überprüft werden müssen, dass sie Sie auf den richtigen Weg bringen können, und erwähnte die damit verbundenen Kosten. Bestimmte behördliche Anforderungen umfassen Mandate für verifizierte Verschlüsselungsalgorithmen.

Die bcrypt-Implementierungen in .NET wurden nicht überprüft. Bei Verwendung einer nicht verifizierten Verschlüsselungsimplementierung können Sie nicht absolut sicher sein, dass weder absichtliche böswillige Fehler darin enthalten sind, z. B. das Zulassen einer Hintertür zu verschlüsselten oder unbeabsichtigten Implementierungsfehlern, die zu kryptografisch unsicheren Daten führen.

Ausgabe 2014: Für alle, die die Notwendigkeit der Verwendung verifizierter kryptopgraphischer Algorithmen in Frage stellen, sollten Sie sich die Verwüstung ansehen, die durch den in OpenSSL ausgenutzten Heartbleed-Hack verursacht wurde. Dies sind die Kosten für die Verwendung einer nicht überprüften Implementierung. Es ist sicher ... bis Sie herausfinden, dass jede Person nur den gesamten Speicherinhalt Ihres Servers lesen kann.

Der Autor der Änderung, mit der Heartbleed eingeführt wurde, Robin Seggelmann, erklärte, er habe "die Validierung einer Variablen mit einer Länge verpasst" und bestritt jegliche Absicht, eine fehlerhafte Implementierung einzureichen. Nach der Offenlegung von Heartbleed schlug Seggelmann vor, sich auf den zweiten Aspekt zu konzentrieren und zu erklären, dass OpenSSL nicht von genügend Personen überprüft wird.

Dies ist die Definition einer nicht verifizierten Implementierung. Selbst der kleinste Defekt kann die gesamte Sicherheit beeinträchtigen.

2015 bearbeiten: Empfehlungsbasierte Sprache entfernt und durch Absolutes ersetzt. Eingebetteter Originalkommentar von Kevin Montrose für die Nachwelt.

Chris Marisic
quelle
25
Um den verknüpften Kommentar zu zitieren: "[wir] sind zu PBKDF2 übergegangen, da es in das .NET-Framework integriert ist, während BCrypt die Überprüfung einer Implementierung erfordern würde." Beachten Sie, dass der Kommentar nicht besagt, dass der Algorithmus besser ist, sondern dass das SE Dev Team die integrierte PBKDF2- Implementierung als vertrauenswürdiger ansieht als eine externe Bibliothek (was letztendlich ein Urteilsspruch ist).
Piskvor verließ das Gebäude
3
@Piskvor Ich habe meine Antwort aktualisiert. Hier geht es nicht darum, was das SO-Team für sicher hält, sondern um eine Entscheidung zwischen von Natur aus als sicher oder hoffentlich sicher. Letzteres ist in Bezug auf Kryptographie nicht akzeptabel.
Chris Marisic
6
Ich frage mich, wie SO alle bcrypt-Hash-Passwörter auf die neuen Hashes migriert hat. Würden sie nicht die rohen Passwörter benötigen, um sie mit dem neuen Algorithmus zu hashen?
Dharmendar Kumar 'DK'
8
@DK Ich glaube nicht einmal, dass Sie sie bitten müssen, ihre Passwörter zurückzusetzen. Beim nächsten Login (wo sie ihr Klartext-Passwort angeben) können Sie es tun, glaube ich.
Matt Kocaj
12
Dies ist ein schlechter Rat und ich bin überrascht, dass es so viele positive Stimmen gibt. Das Überprüfen einer BCrypt-Implementierung in einer verwalteten Sprache ist viel, viel trivialer als das Überprüfen einer vollständigen SSL-Implementierung in C. Heartbleed ist völlig irrelevant. Es ist besser, wenn Sie so etwas wie Probleme beim Erzwingen von PHP-Typen mit Hash-Gleichheitsprüfungen erwähnen. PBKDF2 ist zwar praktisch weitgehend geeignet, aber ein KDF, kein Passwort-Hashing-Algorithmus, während BCrypt besser geeignet ist. Unabhängig davon wäre es heutzutage viel sinnvoller, Argon2 zu verwenden, für das es eine gut getestete C # -Bibliothek gibt
Polynomial