В настоящее время я внедряю систему входа в систему. Я хочу сохранить пароль и соль в базе данных. Теперь я узнал, что есть функция hash()
и crypt()
которая, похоже, делает то же самое (действительна для SHA512).
hash()
является более новым и, кажется, поддерживает больше хэширующих алограммов, чем crypt()
. Или какие-либо другие различия, которые я должен знать / заботиться?
Редактировать:
function generatePasswordHash($password){ $salt = base64_encode(mcrypt_create_iv(8)); $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); return $calculatedPasswordHash; }
Результат выглядит как $1$Qh6ByGJ9$zLn3yq62egvmc9D7SzA2u.
Здесь моя функция проверки пароля:
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; }
Используйте hash
для хэширования, например, при проверке целостности. Он напрямую использует указанный алгоритм хэширования.
crypt
– функция специального назначения. Он используется для хэширования паролей и вывода ключей. Вам нужно будет пройти соль, которая косвенно определяет используемую схему хеширования. Даже если вы выберете CRYPT_SHA512
это не просто SHA512. Это ключевая функция деривации, которая использует SHA512 как строительный блок. В частности, такая схема преднамеренно медленна (атака с применением грубой силы) и безопасно сочетает соль и пароль.
Для хеширования паролей в системе журналов crypt
, безусловно, является правильным выбором.