2010-11-21 46 views
5

¿Parece esto una sal segura para usar con una contraseña? ¿Alguna mejora o sugerencia o defecto obvio?Parece una sal fuerte para una contraseña

$salt = ''; 
for ($i = 0; $i < 50; $i++) { 
    $salt .= chr(rand(33, 126)); 
} 
+0

¡tienes que conocer la sal! esto no es solo hash unidireccional, ¡hashing de una sola vez! que es inútil. – aliqandil

Respuesta

8

No necesita hacer sales realmente largas y no es importante que sean criptográficamente seguras. El objetivo de sales es simplemente dificultar los ataques a tablas de arco iris ya que ya no se cuenta con una asignación de 1 a 1 entre las contraseñas y los hashes. (También mantienen los administradores con los ojos errantes de ver 482c811da5d5b4bc6d497ffa98491e38 en la base de datos y luego saber la clave de Joe es "password123".)

Incluso una sal de 4 bytes sería más que suficiente ya que ahora tendría 2 & aprox; 4.000 hash potenciales para cualquier contraseña.

+0

Vale la pena señalar que esos 4 mil millones de hash _different_ de la misma contraseña dependen de la elección adecuada del algoritmo hash. –

+0

¿El administrador no tiene acceso al código fuente? ¿No puede simplemente registrar el texto plano en un archivo? – rook

+0

@ Graham Lee, estoy usando un SHA512. – sami

3

usaría mt_rand ya que es más rápido, pero esto es sin duda suficiente para la sal.

5

No creo que rand es un buen PRNG. Si recuerdo correctamente, se asigna directamente al c PRNG, que en muchas implementaciones tiene un estado interno terriblemente pequeño (como 32 bits).

Y tampoco está bien sembrado. Pero dado que la función más importante de una sal es evitar las tablas arcoiris precalculadas, que este código hace, debería ser suficiente.

Y yo normalmente dividido mi sal en dos partes:

  1. A por azar por parte del usuario que se almacena en la base de datos junto con el hash
  2. Una sal por cada aplicación que se almacena en el archivo de configuración.

De esta forma, un atacante que solo obtiene acceso a la base de datos pero no al archivo de configuración (un escenario probable si el ataque usa inyección SQL), entonces aún no puede descifrar las contraseñas.

3

La longitud es lo que hace que una sal sea más segura. La aleatoriedad no es muy importante, siempre y cuando sea diferente para cada usuario. Vas a terminar almacenándolo en texto plano de todos modos para que puedas usarlo durante hash.

Cuestiones relacionadas