2011-01-13 15 views
10

Nach der crypt() documentation muss das Salz 22 Basis 64 Ziffern aus dem Alphabet "./0-9A-Za-z" sein.Blowfish Salz Länge für die Crypt() Funktion?

Dies ist der Code Beispiel geben sie:

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$'); 

Der erste Teil verwirrend, dass Salz 25 Zeichen hat, nicht 22.

Frage 1: das heißt noch lange das Salz soll zu sein länger als 22 Zeichen?

Dann habe ich die Funktion selbst getestet und etwas bemerkt. Wenn ich ein 20 Zeichen Salz verwenden, bekomme ich diesen

// using 20 char salt: 00000000001111111111 
crypt('rasmuslerdorf', '$2a$07$00000000001111111111$'); 
// $2a$07$00000000001111111111$.6Th1f3O1SYpWaEUfdz7ieidkQOkGKh2 

Also, wenn ich ein 20 Zeichen Salz verwendet wird, ist das gesamte Salz in der Ausgabe. Das ist praktisch, weil ich das Salz dann nicht an einem anderen Ort aufbewahren muss. (Ich möchte zufällige Salze verwenden). Ich wäre in der Lage, das Salz wieder aus dem generierten Hash zu lesen.

Wenn ich jedoch ein 22-stelliges Salz verwende, wie es in der Dokumentation steht, oder ein längeres, wird das Salz am Ende abgeschnitten.

// using 22 char salt: 0000000000111111111122 
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122$'); 
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui 
// 22nd character of the salt is gone 

// using 25 char salt: 0000000000111111111122222 
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122222$'); 
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui 
// Same hash was generated as before, 21 chars of the salt are in the hash 

Frage # 2: Also, was genau ist die richtige Länge eines Salzes? 20? 22? Länger?

Frage # 3: Ist es auch eine gute Idee, das Salz aus dem Hash zu lesen, wenn es Zeit ist, Passwörter zu überprüfen? Anstatt das Salz in einem separaten Feld zu speichern und es von dort zu lesen. (Dies scheint redundant zu sein, da das Salz in dem Hash enthalten zu sein scheint).

Antwort

8

Blowfish Salze sollten 22 Zeichen lang sein (einschließlich der nachlaufenden $, also 21) - Sie können mit var_dump(CRYPT_SALT_LENGTH) überprüfen, kann ich dies jetzt nicht überprüfen, aber meine Schätzung ist, dass weniger Zeichen einen Fehler und mehr Zeichen zurückgeben werden gekürzt werden.

In Bezug auf Ihre dritte Frage: Ja, Sie sollten lesen und überprüfen Sie den Hash mit den eingebetteten Salt (und Kosten) Parameter aus dem Hash selbst.

+1

CRYPT_SALT_LENGTH gibt 60 auf meiner Win7-Maschine, 123 auf Ubuntu zurück. –

+1

@Burak Guzel: Laut Handbuch ** PHP setzt eine Konstante mit dem Namen 'CRYPT_SALT_LENGTH', die das längste gültige Salz angibt, das von den verfügbaren Hashes ** erlaubt ist. –

+2

@Burak Guzel: CRYPT_SALT_LENGTH gibt 60 bis PHP 5.3.1 zurück, aber 123 von 5.3.2. Dies liegt daran, dass SHA-256 (64 Zeichen langes Salz) und SHA-512 (123 Zeichen langes Salz) mit PHP 5.3.2 eingeführt wurden. – Sliq

Verwandte Themen