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;
}
@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
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
El nuevo código cifra la contraseña, en lugar de hash. es decir, es trivialmente reversible. – CodesInChaos