13

現在、ログインシステムを実装しています。パスワードとソルトをデータベースに保存したい。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;
}
4

1 に答える 1

16

hash整合性チェックなどのハッシュに使用します。指定されたハッシュ アルゴリズムを直接使用します。

cryptは専用関数です。これは、パスワードのハッシュとキーの導出に使用されます。使用するハッシュ スキームを間接的に決定するソルトを渡す必要があります。これを選択しても、CRYPT_SHA512プレーンな SHA512 ではありません。これは、SHA512 をビルディング ブロックとして使用するキー派生関数です。特に、そのようなスキームは故意に遅く (総当たり攻撃を隠して)、salt とパスワードを安全な方法で組み合わせます。

ログ システムでのパスワード ハッシュについてcryptは、明らかに正しい選択です。

于 2012-04-23T13:28:50.147 に答える