2012-04-23 13 views
11

Actualmente estoy implementando un sistema de inicio de sesión. Quiero almacenar la contraseña y el salt en una base de datos. Ahora descubrí que hay una función hash() y crypt() que parece hacer lo mismo (válido para SHA512).hash() vs. crypt() función de comparación

hash() es más reciente y parece ser compatible con más algoritmos de hash que crypt(). ¿O hay alguna otra diferencia que deba saber/preocuparme?

Editar:

function generatePasswordHash($password){ 
    $salt = base64_encode(mcrypt_create_iv(8)); 
    $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); 

    return $calculatedPasswordHash; 
} 

El resultado se parece a $1$Qh6ByGJ9$zLn3yq62egvmc9D7SzA2u.

Aquí mi función de comprobación de contraseñas:

function checkLoginData($username, $password){ 
    global $db; 

    $sql = "SELECT * FROM users WHERE username = :username"; 
    $result = $db->ExecuteQuery($sql, array("username"=>$username)); 

    if(!empty($result)){ 
     $result = $result[0]; 
     $savedPasswordHash = $result['password']; 
     $splitted = explode("$", $savedPasswordHash); 
     $salt = $splitted[2]; 
     $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); 

     if($savedPasswordHash === $calculatedPasswordHash){ 
      return true; 
     } 
    } 

    return false; 
} 
+0

@CodeInChaos: Almacenar y acceder a hash de contraseñas de la base de datos. Ambos pueden tomar una sal (agregue sal al parámetro '$ data' de' hash() 'mediante concatenación). – testing

+1

Solo concatenar la sal a los datos es inseguro en muchos casos. No hagas eso, a menos que realmente sepas lo que estás haciendo. También es * rápido * y quiere que sea * lento *. – CodesInChaos

+1

El nuevo código cifra la contraseña, en lugar de hash. es decir, es trivialmente reversible. – CodesInChaos

Respuesta

15

Uso hash para hash, por ejemplo, en las comprobaciones de integridad. Utiliza directamente el algoritmo hash especificado.

crypt es una función de propósito especial. Se usa para el hash de contraseñas y la derivación de claves. Tendrá que pasar una sal, que indirectamente determina el esquema de hash utilizado. Incluso si elige CRYPT_SHA512, esto no es simple SHA512. Es una función clave de derivación que usa SHA512 como componente básico. En particular, dicho esquema es deliberadamente lento (ataca ataques de fuerza bruta) y combina sal y contraseña de forma segura.

Para el hash de contraseñas en un sistema de registro, crypt es claramente la opción correcta.

+0

¿Qué función prefiere usar para almacenar/recuperar hashes de contraseñas? – testing

+2

'crypt' con' CRYPT_BLOWFISH' y una sal de alta calidad, de un crypto PRNG, como 'mcrypt_create_iv' debería estar bien. Esto requiere php 5.3. Pero como no soy programador de PHP, no he investigado los detalles. – CodesInChaos

+0

Descubrí que el espacio web solo proporciona 'DES estándar' y' MD5'. Echaré un vistazo a la biblioteca 'mcrypt' ... – testing