it-swarm.com.de

Erkläre BCrypt, als wäre ich 5

Ich weiß, dass dies ein bisschen weit gefasst ist, aber ich möchte die Funktion dieses Algorithmus verstehen, indem ich erkläre, dass ich 5 bin. Und ich möchte den Unterschied zwischen BCrypt und Blowfish kennen, weil BCrypt a verwendet Salz?

Ich habe gelesen, aber ich sehe Informationen auf einem niedrigen Niveau, und ich möchte nicht so tief gehen. Ich möchte eine einfachere Erklärung erhalten (Kenntnis der Grundlagen wie Salz, Bits usw.).

Ich weiß zum Beispiel, dass der erste Teil eines Passworts lautet:

$2$: Blowfish-based crypt ('bcrypt')

Und dann ist die zweite Runde. Beispielsweise, $10$ gibt 2 ^ 10 wichtige Erweiterungsrunden an, aber was bedeutet das genau?

Eine Beispielantwort wäre:

  1. Zuerst machen Sie das Salz mit Algorithmus X.
  2. Dann erhalten Sie eine Zufallszahl von X.
  3. Dann machst du mit der Runde X.

Ich hoffe, es ist klar.

5
Skizo-ozᴉʞS

Bcrypt verwendet Blowfish Blockverschlüsselung mit symmetrischem Schlüssel und akzeptiert 3 Parameter; Kosten, Salz und Passwort.

  • Die Kosten werden von der Systemebene bestimmt, damit der Administrator den Zeitpunkt des Angriffs auf die Kennwortsuche bestimmen kann, siehe Hashcat . Es bestimmt die Anzahl der Iterationen als iter= 2^cost wo die Kosten zwischen 2 und 31 liegen.

  • Das Salz ist ein zufälliges 16-Byte. Es kann jede gute Zufallsquelle als \dev\urandom

  • Das Passwort ist das zu verarbeitende Passwort des Benutzers. Die Größe der Passwörter beträgt 1 bis 72 Bytes.

  • Die Ausgabe von Bcrypt beträgt 24 Bytes.

Die Bcrypt verschlüsselt den Text OrpheanBeholderScryDoubt in einem verketteten EZB-Modus.

 state = EksBlowfishSetup(cost, salt, password) //Special key scheduling 
 ctext = "OrpheanBeholderScryDoubt"
 repeat (64)
      ctext = EncryptECB(state, ctext)
 return Concatenate(cost, salt, ctext)

Aktualisierung der Kosten

EksBlowfishSetup (Extensive Key Setup) kurz wie folgt;

state = InitialState()
state = ExpandKey(state, salt, password)
repeat (2^cost)
    state = ExpandKey(state, 0, password)
    state = ExpandKey(state, 0, salt)

Die Kosten spielen bei der oben genannten Funktion von BCrypt eine Rolle. Wenn die Kosten steigen, läuft die Wiederholungsschleife exponentiell. Dies erhöht die Angriffszeit, wie Sie aus Tabelle dieser Antwort sehen können. Wenn Sie es mit Hashcat vergleichen möchten, sehen Sie einen Benchmark für Tesla K80

Hinweis: dass Bcrypt alt ist (1999), sollten Sie Argon2i als Gewinner des verwenden Passwort-Hashing-Wettbewerb .

7
kelalaka

Hashing versus Verschlüsselung

Der größte Unterschied zwischen bcrypt und Blowfish besteht darin, dass Blowfish ein symmetrischer Verschlüsselungsalgorithmus und bcrypt ein Hashing-Algorithmus ist. (Es ist eine spezielle Art von Hashing-Algorithmus, aber wir werden später darauf zurückkommen.)

Verschlüsselung (was Blowfish macht)

Ein symmetrischer Verschlüsselungsalgorithmus verwendet einen geheimen Schlüssel und etwas Klartext (der Begriff "Nachricht" wird regelmäßig verwendet und die Variable m wird normalerweise verwendet, um darauf zu verweisen). und gibt Chiffretext aus, c . Die Idee ist, dass der Chiffretext nur mit demselben geheimen Schlüssel, der beim Verschlüsseln verwendet wurde, wieder in die ursprüngliche Nachricht umgewandelt werden kann.

[^ same]: Ich gebe hier ungefähr wahre Antworten, um mich auf die zentralen Ideen und Konzepte zu konzentrieren. Ich hoffe, dass diejenigen, die erkennen, wo meine Antworten nicht genau zutreffen, mich für Expository-Zwecke etwas lockerer machen.

Also könnte Alice die Nachricht "Attack at Dawn" mit dem Schlüssel 13 verschlüsseln (dies ist nicht Blowfish, aber es ist eine symmetrische Verschlüsselung) und den Chiffretext erzeugen. " Nggnpx ng qnja ". Sie kann diesen Chiffretext an Bob senden, und wenn Bob weiß, dass der Schlüssel 13 ist, kann er den Chiffretext wieder in die ursprünglichen Nachrichten umwandeln. Manchmal möchte Alice keine Nachricht an eine andere Person senden, aber sie möchte sie für sich speichern, um sie zu einem späteren Zeitpunkt lesen zu können. Wir können uns diese Fälle als Alice vorstellen, die eine Nachricht an die zukünftige Alice sendet.

Mit Blowfish (anstelle der Verschlüsselung, die ich in meinem Beispiel verwendet habe) ist es praktisch unmöglich, dass jemand, der nicht über den Schlüssel verfügt, etwas über die ursprüngliche Nachricht (außer deren Länge und Existenz) aus dem Chiffretext erfährt. Abgesehen davon ist AES ein bevorzugter symmetrischer Verschlüsselungsalgorithmus gegenüber Blowfish, aber ich werde Blowfish weiterhin in meinen Beschreibungen verwenden, da dies gefragt wurde.

Hashing

Ein kryptografischer Hash-Algorithmus (bcrypt ist eine spezielle Art mit einigen Extras, aber ich beginne mit einem einfacheren Fall) benötigt keinen Schlüssel und ist praktisch nicht umkehrbar. Ein kryptografischer Hash-Algorithmus wie SHA256 würde also eine Nachricht (sagen wir ein Passwort) wie "JaguarsRule!" und verwandle es in einen Hash.

$ echo -n 'JaguarsRule!' | shasum -a256
13f26e5a60e402d895c5ce1d9492d080563c5079a8b5f52a25953fd24a2cb1da  

Eine der verschiedenen Eigenschaften eines kryptografischen Hashs ist, dass Sie "JaguarsRule!" Nicht realisierbar berechnen können. von 13f26e5a60e402d895c5ce1d9492d080563c5079a8b5f52a25953fd24a2cb1da. In diesem Fall gibt es keinen Schlüssel.

Ein einfacher Hashing-Mechanismus wie dieser scheint daher eine gute Möglichkeit zu sein, Kennwörter auf einem Server zu überprüfen. Angenommen, Sie führen einen Webdienst aus, bei dem sich Personen anmelden. Sie haben einen Benutzer, sagen wir mit dem Benutzernamen jason, der sein Konto mit dem Passwort JaguarsRule! Einrichtet. Da Sie nicht möchten, dass jemand, der lesen kann, was sich auf Ihrem Server befindet, Jasons Passwort erfährt, speichern Sie das Passwort nicht selbst. Stattdessen speichern Sie den Hash.

Wenn sich Jason (oder jemand, der vorgibt, Jason zu sein) auf Ihrem Server anmeldet, nimmt er das eingegebene Kennwort und führt die Hashing-Operation darauf aus und vergleicht den gespeicherten Hash. Wenn die Hashes übereinstimmen, weiß das System, dass das richtige Passwort eingegeben wurde.

Salze und langsames Kochen

Das oben beschriebene Schema, bei dem ein allgemeiner kryptografischer Hash wie SHA256 verwendet wird, funktioniert hervorragend, abgesehen von einer Sache: Die Leute wählen erratene Passwörter aus. Wenn Leute Passwörter wie wZFoO_SKrgEw Genauso wahrscheinlich verwenden würden wie JaguarsRule!, Würden wir keine speziellen Hashing-Funktionen wie bcrypt benötigen. Aber Menschen, die Menschen sind, werden Passwörter nicht zufällig und gleichmäßig über einen ausreichend großen Raum auswählen. Stattdessen wählen sie mit größerer Wahrscheinlichkeit einige mögliche Passwörter gegenüber anderen aus.

Salz

Betrachten Sie einen anderen Benutzer Ihres Systems, pillboy. Pill Boy ist auch ein Fan der Jacksonville Jaguars und hat zufällig auch JaguarsRule! Als Passwort gewählt. Bei Verwendung von (ungesalzenem) Hashing entspricht der Hash für das Passwort von Pill Boy dem Hash für Jasons Passwort. Ein Angreifer muss nur Hashes vergleichen, um festzustellen, dass diese beiden Benutzer dasselbe Kennwort haben.

Wenn ein Angreifer auf die eine oder andere Weise feststellt, dass Jasons Passwort JaguarsRule ist! `, Kennt er sofort das Passwort von Pill Boy. Darüber hinaus könnte sie eine große Liste von Hashes für die häufigsten Passwörter erstellen.

Die Lösung hierfür besteht darin, das Kennwort vor dem Hashing mit etwas Einzigartigem zu versalzen. Wenn Sie also zum ersten Mal einen Hash von Jasons Passwort erstellen (wenn Jason sich zum ersten Mal anmeldet und das Passwort erstellt), fügen Sie ihm einige zufällige Dinge hinzu. Angenommen, Ihr System erstellt zu diesem Zeitpunkt das Salz 9cb3779f69e271c1. Es wird dann vor dem Hashing vor das Passwort geklebt, so dass es wirklich so etwas wie 9cb3779f69e271c1JaguarsRule! Hasht (auf diese Weise wird das Salz nicht hinzugefügt, aber dies ist nah genug, um zu erklären, wofür Salz ist.). Der Hash von 9cb3779f69e271c1JaguarsRule! Ist völlig anders als der Hash von JaguarsRule!.

Das System muss wissen, was das Salz war, wenn es Zeit ist, ein Passwort zu überprüfen. So werden das Salz und der Hasch zusammen mit dem Benutzernamen des Jason gespeichert. Wenn Pill Boy sein Konto erstellt, wird es mit einem anderen zufällig generierten Salt eingerichtet, sodass seine Kombination aus Salt und Passwort einen anderen Hash erzeugt.

Das, was Sie auf Ihrem Server speichern, könnte also so aussehen

[
    {
        "algorithm": "sha256",
        "username": "jason",
        "salt": "9cb3779f69e271c1",
        "hash": "37a932267ed055facf03cc5d09ca90f927a1eed47a8cd4856e57cd67434426be"
    },
    {
        "algorithm": "sha256",
        "username": "pillboy",
        "salt": "0a19471dab710025",
        "hash": "4be637a8c85455dce0cdc1c7670f062764100276b6ed64141c06fbef4578f185"
    },

]

Da diese Benutzer unterschiedliche Salze haben, können wir nicht erkennen, dass sie dasselbe Kennwort haben, und der Angreifer kann die Hashes nicht mit einer Liste vergleichen, die er aus dem Hashing gemeinsamer Kennwörter vorberechnet hat.

Bcrypt benötigt also ein Salz, da es für das Hashing von Passwörtern ausgelegt ist.

Nehmen Sie es langsam

Salting ist absolut notwendig, aber es hindert einen Angreifer, der auf dem Server gespeichert ist, nicht daran, automatisch zu raten. Sie kann das Salz nehmen und es mit gängigen Passwörtern kombinieren und Hashes berechnen, bis sie eine Übereinstimmung findet. Sie ist möglicherweise in der Lage, zehn oder Hunderte Millionen Passwortschätzungen pro Sekunde durchzuführen.

Einer der Gründe, warum sie so viele Vermutungen so schnell berechnen kann, ist, dass kryptografische Hash-Algorithmen wie sha256 so konzipiert sind, dass sie schnell und effizient sind und dennoch ihre Sicherheitseigenschaften erfüllen. Dinge wie bcrypt sind also "langsames Hashing". Die Idee ist, dass das Erreichen einer Nachricht (Salt und Passwort) zu einem Hash so viel Rechenaufwand erfordert, dass ein typischer Computer eine Viertelsekunde benötigt, um den Hash auszuführen.

Der Benutzer wird keine Verzögerung von einer Viertelsekunde bemerken, aber wenn der Angreifer dieselbe Art von Computer verwendet, wird er auf vier Vermutungen pro Sekunde anstatt auf 10 Millionen reduziert. (In der Praxis wird sie über speziell konfigurierte Computergeräte verfügen, aber es ist eine gute Sache, sie von Millionen von Vermutungen pro Sekunde auf Zehntausende von Vermutungen pro Sekunde zu verlangsamen.)

bcrypt ist einer von mehreren "langsamen Hashes". Andere sind PBBKDF2, scrypt und Argon2. Die letzten beiden erfordern nicht nur viel Berechnung, um den Hash zu erstellen, sondern auch viel Speicher.

Bcrypt ist großartig, aber ...

Salting und langsames Hashing sollten jedes Passwort-Hashing-System durchführen. Es bringt aber auch sinkende Renditen. Es gibt so viel, was langsames Hashing für den Verteidiger tun kann, und deshalb müssen wir (solange Passwörter vorhanden sind) die Leute dazu bringen, härter zu raten. Ich habe mehr darüber in Bcrypt ist großartig, aber ... geschrieben

NB: Vielen Dank https: //security.stackexchange.com/users/6253/schroeder Für das korrekte Löschen meiner vorherigen Antwort, in der ich "wie ich 5 bin" wörtlich genommen habe. Und ich entschuldige mich beim Originalplakat dafür, dass ich snarky statt hilfreich war.

6