web-dev-qa-db-de.com

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

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 ein Schwindel ist oder nicht.

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

125
Svish

Zunächst einige wichtige Begriffe:

Hashing - Der Vorgang, einen String zu nehmen und eine Folge von Zeichen zu erzeugen, die nicht auf den zurückgesetzt werden können ursprüngliche Zeichenfolge.

Symmetrische Verschlüsselung - (Wird normalerweise nur als "Verschlüsselung" bezeichnet) - Der Vorgang, bei dem ein String genommen wird und Erzeugen einer Folge von Zeichen, die unter Verwendung des gleichen Verschlüsselungsschlüssels, der sie verschlüsselt hat, in die ursprüngliche Zeichenfolge entschlüsselt werden können .

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

Salt - 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 Verified Referenzimplementierung. Dies ist wichtig, da nicht festgestellt werden kann, ob eine vorhandene Implementierung schwerwiegende Mängel aufweist. Eine Implementierung von BCrypt für .NET finden Sie hier . Ich weiß nicht genug über Kryptographie, um zu sagen, ob es sich um eine gute oder schlechte Implementierung handelt. Kryptographie ist ein sehr tiefes Feld. Versuchen Sie nicht, Ihren eigenen Verschlüsselungsalgorithmus zu erstellen . Ernsthaft.

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

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

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

Der bcrypt-Algorithmus funktioniert, weil es fünf Größenordnungen länger dauert, ein Passwort zu hashen als MD5 ; (und immer noch viel länger als AES oder SHA-512). Der Hacker muss viel mehr Zeit aufwenden, um eine Rainbow-Tabelle zum Nachschlagen Ihrer Passwörter zu erstellen. Dadurch ist es weitaus unwahrscheinlicher, dass Ihre Passwörter gehackt werden.

Wenn Sie Ihre Passwörter salzen und haschen und jedes Salt anders ist , müsste ein potenzieller Hacker für jede Salt-Variante eine Rainbow-Tabelle erstellen, um nur einen Rainbow zu haben Tabelle für ein gesalzenes + gehashtes Passwort. Das heißt, wenn Sie 1 Million Benutzer haben, muss ein Hacker 1 Million Rainbow-Tabellen generieren. Wenn Sie für jeden Benutzer das gleiche Salt verwenden, muss der Hacker nur eine Rainbow-Tabelle generieren, um Ihr System erfolgreich zu hacken.

Wenn Sie Ihre Passwörter nicht einschränken, muss ein Angreifer für jede Implementierung (AES, SHA-512, MD5) lediglich eine vorhandene Rainbow-Tabelle abrufen und feststellen, ob eine mit dem Hash übereinstimmt. Dies wurde bereits getan , ein Angreifer muss diese Rainbow-Tabellen nicht selbst berechnen.

Trotz alledem müssen Sie gute Sicherheitspraktiken anwenden . Wenn sie erfolgreich einen anderen Angriffsvektor (XSS, SQL Injection, CSRF, ua ) auf Ihrer Site verwenden können, spielt eine gute Kennwortsicherheit keine Rolle. 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 ich Ihre Benutzer dazu bringen kann, mir ihre Cookies über XSS zu geben , ist dies nicht der Fall ist es egal, wie gut Ihre Passwortsicherheit ist .

Andere Ressourcen:

  1. Jeff Atwood: . NET Encryption Simplified (ideal für einen Überblick über Hashing)
  2. Jeff Atwood: Ich habe mich gerade als Sie angemeldet
  3. Jeff Atwood: Wahrscheinlich speichern Sie Passwörter 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 zu diesem Thema so deutlich wie Jeff. Bitte bearbeiten Sie die Artikel so, wie Sie sie finden.

142
George Stocker

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

StackId verwendete zuvor BCrypt und wechselte aus genau diesem Grund zu PBKDF2:

Für Neugierige haben wir mit PBKDF2 Passwörter. Relavent Code ist hier ( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135 ), über einige Indirektionsebenen. In einer früheren Iteration verwendeten wir BCrypt. wechselte jedoch zu PBKDF2, da es in das .NET-Framework integriert ist, wohingegen BCrypt eine Überprüfung der Implementierung erforderlich machen würde (kein kleines Unternehmen).

Kevin Montrose, 27. Mai 2011

(Aktualisierter Link auf GitHub)

Bearbeiten: Die Bedeutung von verifiziert in kryptografischen Begriffen scheint nicht leicht zu verstehen zu sein. Eine verifizierte Implementierung bedeutet, dass sie kryptografisch ist erwiesenermaßen fehlerfrei implementiert. Die Kosten hierfür können leicht 20.000 US-Dollar oder mehr erreichen. Ich erinnere mich daran, als ich über OpenSSL recherchierte und las, wo sie angaben, dass sie nicht den gesamten Überprüfungsprozess abgeschlossen haben, aber wenn Sie eine vollständige Überprüfung benötigen, können sie Ihnen den richtigen Weg weisen und die damit verbundenen Kosten nennen. Bestimmte behördliche Anforderungen beinhalten Mandate für verifizierte Verschlüsselungsalgorithmen.

Die bcrypt-Implementierungen in .NET wurden nicht überprüft. Wenn Sie eine nicht überprüfte Verschlüsselungsimplementierung verwenden, können Sie nicht absolut sicher sein, dass keine vorsätzlichen böswilligen Fehler vorliegen, z.

2014 edit: Für alle, die die Notwendigkeit der Verwendung verifizierter kryptografischer Algorithmen in Frage stellten, werfen Sie einen Blick auf die Verwüstung, die durch den heartbleed hack verursacht wurde in OpenSSL ausgenutzt. 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, die Heartbleed einführte, Robin Seggelmann, erklärte, dass er "die Validierung einer Variablen mit einer Länge verpasst habe" und lehnte jede Absicht ab, eine fehlerhafte Implementierung einzureichen. Nach der Offenlegung von Heartbleed schlug Seggelmann vor, sich auf den zweiten Aspekt zu konzentrieren und darauf hinzuweisen, dass OpenSSL nicht von genügend Personen überprüft wird.

Dies ist die Definition einer nicht überprüften Implementierung. Selbst der kleinste Defekt kann die gesamte Sicherheit lahm legen.

2015 edit: Empfehlungsbasierte Sprache entfernt und durch Absolutes ersetzt. Eingebetteter originaler Kevin Montrose Kommentar für die Nachwelt.

71
Chris Marisic