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.
Vielleicht (hoffentlich) ist das Passwort [gesalzen] (http://en.wikipedia.org/wiki/Salt_ (Kryptografie))? –
[Salting!] (Http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –
Dieses Verhalten ist _emphatically_ by design. – SLaks