Warum erzeugt crypt / blowfish denselben Hash mit zwei verschiedenen Salzen?

Diese Frage hat zu tun mit PHP Implementierung von crypt(). Für diese Frage, die ersten 7 Zeichen des Salzes werden nicht gezählt, so dass ein Salz '$2a$07$a' sagt, Sie haben eine Länge von 1, da es nur 1 Zeichen von Salz und sieben Zeichen der meta-Daten.

Wenn die Verwendung von Salz-Zeichenfolgen, die länger als 22 Zeichen, es ist keine änderung in der hash generiert (d.h., abschneiden), und bei der Verwendung von Zeichenketten, die kürzer als 21 Zeichen der salt wird automatisch aufgefüllt werden (mit '$' Zeichen, offenbar); dies ist Recht einfach. Allerdings, wenn gegeben, eine Salz 20 Zeichen und ein Salz 21 Zeichen, wo die beiden sind identisch, außer für das Letzte Zeichen der 21-Länge Salz, beide Hash-strings identisch sein wird. Ein Salz 22 Zeichen lang, die identisch ist mit der 21 Länge Salz, außer für den letzten Charakter, der hash wird wieder anders werden.

Beispiel In Code:

$foo = 'bar';
$salt_xx = '$2a$07$';
$salt_19 = $salt_xx . 'b1b2ee48991281a439d';
$salt_20 = $salt_19 . 'a';
$salt_21 = $salt_20 . '2';
$salt_22 = $salt_21 . 'b';

var_dump(
    crypt($foo, $salt_19), 
    crypt($foo, $salt_20), 
    crypt($foo, $salt_21), 
    crypt($foo, $salt_22)
);

Produzieren:

string(60) "$2a$07$b1b2ee48991281a439d$$.dEUdhUoQXVqUieLTCp0cFVolhFcbuNi"
string(60) "$2a$07$b1b2ee48991281a439da$.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2O4AH0.y/AsOuzMpI.f4sBs8E2hQjPUQq"

Warum ist das so?

EDIT:

Einige Benutzer darauf hingewiesen werden, dass es einen Unterschied in der Gesamt-string, das ist wahr. In salt_20 -, offset - (28, 4) ist da$.während in salt_21 -, offset - (28, 4) ist da2.; es ist jedoch wichtig zu beachten, dass die generierten Zeichenkette enthält den Hashwert, das Salz, sowie eine Anleitung zum generieren des Salzes (d.h. $2a$07$); der Teil, in dem der Unterschied Auftritt, ist in der Tat noch das Salz. Der eigentliche hash ist unverändert als UxGYN739wLkV5PGoR1XA4EvNVPjwylG.

So, das ist in der Tat kein Unterschied in der hash produziert, aber einen Unterschied in der Salz verwendet zum speichern der hash, das ist genau das problem: zwei Salze generieren, die denselben hash.

Rembmer: die Ausgabe erfolgt im folgenden format:

"$2a$##$saltsaltsaltsaltsaltsaHASHhashHASHhashHASHhashHASHhash"
//                           ^ Hash Starts Here, offset 28,32

wobei ## die log-base-2 die Bestimmung der Anzahl der Iterationen, die der Algorithmus läuft für

Edit 2:

In die Kommentare, es wurde gewünscht, dass ich post Sie einige zusätzliche Informationen, wie der Benutzer nicht reproduzieren konnten meine Ausgabe. Ausführung des folgenden Codes:

var_dump(
    PHP_VERSION, 
    PHP_OS, 
    CRYPT_SALT_LENGTH, 
    CRYPT_STD_DES, 
    CRYPT_EXT_DES, 
    CRYPT_MD5, 
    CRYPT_BLOWFISH
);

Erzeugt die folgende Ausgabe:

string(5) "5.3.0"
string(5) "WINNT"
int(60)
int(1)
int(1)
int(1)
int(1)

Hoffe, das hilft.

InformationsquelleAutor der Frage Dereleased | 2010-02-08

Schreibe einen Kommentar