2012-06-24 2 views
8

ich arbeite mit Rails und ich bemerkte, dass mein password_digest ist unterschiedlich für 2 Benutzer mit allen anderen Feldern außer dem Passwort Digest anders. aber ich habe das gleiche Passwort "ABCD" sowohl für ..
es endete Erzeugung dieses 2 verschiedene HashesWarum unterscheidet sich der Passwort-Hash für 2 Benutzer mit dem gleichen Passwort?

  1. $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
  2. $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem

ich dachte, das bcrypt Juwel erzeugt den Hash nur basierend auf dem Passwortfeld! Liege ich falsch? danke :)

+0

Vielleicht (hoffentlich) ist das Passwort [gesalzen] (http://en.wikipedia.org/wiki/Salt_ (Kryptografie))? –

+0

[Salting!] (Http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –

+0

Dieses Verhalten ist _emphatically_ by design. – SLaks

Antwort

16

Was Sie hier betrachten, ist mehr als ein Passwort-Hash, es gibt eine Menge Metadaten über den Hash in diesen Strings enthalten. 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.

Die $ 2a $ ist der bcrypt Algorithmus, der verwendet wurde.

Der $ $ 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.

Die $ 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 Hashwert, wenn er mit dem 2a-Algorithmus verwendet wird, Kosten von 10 und das angegebene Salz. Der Grund für das Salz ist, dass ein Angreifer bcrypt-Hashes nicht vorberechnen kann, um die Kosten für deren Erzeugung zu vermeiden.

In der Tat ist dies die Antwort auf Ihre ursprüngliche Frage: Der Grund, die Hashes unterschiedlich sind, denn wenn sie gleich wären, würden Sie, dass zu jeder Zeit wissen, dass Sie die bcrypt Zeichenfolge sah $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO Sie das Passwort wäre abcd kennen würde. 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, da $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem auch abcd ist. Und es gibt viele viele weitere Hashes, die das Ergebnis von bcrypt('abcd') sein werden. Dies macht es fast unmöglich, eine Datenbank für abcd Passwörter zu erstellen.

+1

danke! :) das war wirklich hilfreich und viel mehr als das, was ich erwartet hatte! – viswa

2

bcrypt speichert das Salz im Passwort-Hash.

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

Bei der Überprüfung der Passwörter liest bcrypt das Salz aus dem Hash-Feld und berechnet dann den Hash unter Verwendung dieses Salzes neu.

Verwandte Themen