Сравнение hash() против crypt()

В настоящее время я внедряю систему входа. Я хочу сохранить пароль и соль в базе данных. Теперь я узнал, что есть функция hash() и crypt(), которая, похоже, делает то же самое (для SHA512).

hash() является более новым и, кажется, поддерживает больше хэширующих алограмм, чем crypt(). Или какие-либо другие различия, которые я должен знать/заботиться?

Edit:

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;
}

Ответ 1

Используйте hash для хэширования, например, при проверке целостности. Он напрямую использует указанный алгоритм хэширования.

crypt - функция специального назначения. Он используется для хэширования паролей и вывода ключей. Вам нужно будет пройти соль, которая косвенно определяет используемую схему хеширования. Даже если вы выберете CRYPT_SHA512, это не просто SHA512. Это ключевая функция деривации, которая использует SHA512 как строительный блок. В частности, такая схема преднамеренно медленна (атака с применением грубой силы) и безопасно сочетает соль и пароль.

Для хеширования паролей в системе журналов crypt, безусловно, является правильным выбором.