Warum unterscheidet sich der Passwort-Hash für 2 Benutzer mit dem gleichen Passwort?

8

ich arbeite mit Rails und ich habe festgestellt, dass mein password_digest für zwei Benutzer unterschiedlich ist und alle anderen Felder außer dem Passwort-Digest anders sind. aber ich benutzte das gleiche Passwort "abcd" für beide ..
es endete damit, dass diese 2 verschiedenen Hashes

erzeugt wurden
  1. a$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
  2. a$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem

Ich dachte, das bcrypt-Juwel erzeugt den Hash nur auf Basis des Passwortfeldes! Liege ich falsch? Danke:)

    
viswa 24.06.2012, 12:48
quelle

2 Antworten

16

Was Sie hier sehen, ist mehr als ein Passwort-Hash, es gibt eine Menge Metadaten über den Hash, der in diesen Strings enthalten ist. In Bezug auf bcrypt würde der gesamte String als der bcrypt-Hash betrachtet werden. Hier ist, was es beinhaltet:

$ ist das Trennzeichen in bcrypt.

$ 2a $ ist der verwendete bcrypt-Algorithmus.

Der $ 10 $ ist der Kostenfaktor, der verwendet wurde. Aus diesem Grund ist bcrypt sehr beliebt zum Speichern von Hashes. Jeder Hash ist mit einer Komplexität / Kosten verbunden, die Sie sich vorstellen können, wie schnell ein Computer diesen Hash generieren kann. Diese Zahl steht natürlich im Verhältnis zur Geschwindigkeit von Computern. Da Computer im Laufe der Jahre immer schneller werden, wird es immer weniger Zeit benötigen, um einen Hash mit den Kosten von 10 zu generieren. Im nächsten Jahr erhöhen Sie also Ihre Kosten auf 11 bis 12 ... 13 ... und so weiter. Dadurch können Ihre zukünftigen Hashes stark bleiben, während Ihre älteren Hashes weiterhin gültig bleiben. Beachten Sie, dass Sie die Kosten für einen Hash nicht ändern können, ohne die ursprüngliche Zeichenfolge erneut zu laden.

Das $ QyrjMQf ... ist eine Kombination aus dem Salz und dem Hash. Dies ist eine Base64-codierte Zeichenfolge.

Die ersten 22 Zeichen sind das Salz.

Die verbleibenden Zeichen sind der Hash, wenn sie mit dem 2a-Algorithmus, den Kosten von 10 und dem gegebenen Salz verwendet werden. Der Grund für das Salz ist, dass ein Angreifer bcrypt-Hashes nicht vorberechnen kann, um die Kosten für deren Erzeugung zu vermeiden.

Tatsächlich ist dies die Antwort auf Ihre ursprüngliche Frage: Der Grund, warum die Hashes unterschiedlich sind, ist, dass wenn Sie identisch wären, Sie jederzeit wissen würden, dass das Passwort a$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO ist, wenn Sie die bcrypt Zeichenfolge abcd sehen. . Sie können also einfach Hash-Datenbanken durchsuchen und schnell alle Benutzer mit dem abcd-Passwort finden, indem Sie diesen Hash nachschlagen.

Sie können dies nicht mit bcrypt tun, weil a$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem auch abcd ist. Und es gibt viele viele weitere Hashes, die das Ergebnis von bcrypt('abcd') sein werden. Das macht es fast unmöglich, eine Datenbank für abcd-Passwörter zu erstellen.

    
Ryan 24.06.2012, 13:27
quelle
2

bcrypt speichert das Salz im Passwort-Hash.

Das sind zwei verschiedene Hashes des gleichen Passwortes mit zwei verschiedenen Salzen.

Beim Verifizieren der Passwörter liest bcrypt das Salz aus dem Hash-Feld und berechnet dann den Hash unter Verwendung dieses Salzes neu.

    
SLaks 24.06.2012 13:28
quelle

Tags und Links