2011-01-13 12 views
10

De acuerdo con crypt() documentation, la sal debe tener 22 dígitos base 64 del alfabeto "./0-9A-Za-z".Longitud de sal del pez globo para la función Cripta()?

Este es el ejemplo de código que dan:

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

La primera parte confusa es que la sal tiene 25 caracteres, no 22.

Pregunta # 1: sí significa que la sal se supone ser más largo que 22 caracteres?

Luego probé la función y noté algo. Si utilizo una sal de 20 caracteres, consigo este

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

Así, cuando utilicé una sal de 20 caracteres, la sal entero está en la salida. Lo cual es conveniente, porque no tengo que almacenar la sal en un lugar separado. (Quiero usar sales aleatorias). Podría leer la sal del hash generado.

Sin embargo, si utilizo una sal de 22 caracteres como dice la documentación, o una más larga, la sal se corta al final.

// 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 

Pregunta # 2: Así que, ¿qué es exactamente la longitud adecuada de una sal? 20? 22? ¿Más?

Pregunta # 3: Además, ¿es una buena idea leer la sal del hash cuando llega el momento de verificar las contraseñas? En lugar de almacenar la sal en un campo separado y leerla desde allí. (Lo cual parece redundante ya que la sal parece estar incluida en el hash).

Respuesta

8

Las sales de Blowfish deben tener 22 caracteres de longitud (incluidos los $ finales, por lo que 21) - puede verificar con var_dump(CRYPT_SALT_LENGTH), no puedo verificar esto ahora, pero mi conjetura es que menos caracteres devolverán un error y más caracteres ser truncado

En relación con su tercera pregunta: sí, debe leer y verificar el hash utilizando los parámetros sal (y costo) incrustados del propio hash.

+1

CRYPT_SALT_LENGTH está devolviendo 60 en mi máquina Win7, 123 en Ubuntu. –

+1

@Burak Guzel: según el manual ** PHP establece una constante llamada 'CRYPT_SALT_LENGTH' que indica la sal válida más larga permitida por los hashes disponibles **. –

+2

@Burak Guzel: CRYPT_SALT_LENGTH devuelve 60 hasta PHP 5.3.1, pero 123 desde 5.3.2. Esto se debe a que se introdujeron SHA-256 (64 carbonos de sal larga) y SHA-512 (123 carbonos de sal larga) con PHP 5.3.2. – Sliq

Cuestiones relacionadas