web-dev-qa-db-ja.com

ランダムなソルトを使用した単純なワールプールハッシュは安全ですか?

ユーザーにログインを要求するサイトで作業しています。これは、MySQLではPHP=で記述されており、パスワードはソルト付きのWhirlpoolハッシュとして保存されます(ソースコードは後で))。

ただし、セキュリティサイトまたは他の開発者はこれに反対し(実際にはSHA-256ですが、要点は残っています)、bcryptまたはPBKDF2を推奨しています。これらのいずれかを使用することの利点や、なぜ現在のものが間違っているのかはわかりません。誰かが彼らの推論を説明してもいいですか?

登録するコードは次のとおりです。

$escusrnm = $con->real_escape_string($_POST["usrnm"]);
$newSalt = substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31);
$passHashed = hash("whirlpool", $_POST["pss"].$newSalt);
$con->query("INSERT INTO users (username, pass, hash) VALUES ('{$escusrnm}', '{$passHashed}', '{$newSalt}')");
$_SESSION["usernm"] = $_POST["usrnm"];

これが私のログインコードです:

$escusrnm = $con->real_escape_string($_POST["usrnm"]);
$getdats = $con->query("SELECT * FROM users WHERE username='{$escusrnm}'");
if (mysqli_num_rows($getdats) > 0) {
    $getdats = $getdats->fetch_assoc();
    if(hash("whirlpool", $_POST["pss"].($getdats["hash"])) == $getdats["pass"]) {
        $_SESSION["usernm"] = $getdats["username"];
    } else {
        $errormsg = "There was an error. Check your information again, or register.";
    }
} else {
    $errormsg = "There was an error. Check your information again, or register.";
}
3
cjfaure

これらのいずれかを使用することの利点や、なぜ現在のものが間違っているのかはわかりません。誰かが彼らの推論を説明してもいいですか?

Bcryptはワールプールよりも強くすることができます、それはあなたの強度設定に依存します。これはbcryptの最も重要な利点の1つであり、コンピューターがより強力になるにつれて強度を高めることができ、さらにGPUを使用してクラックすることは非常に困難です単純なSHA /ワールプールハッシュと比較。

PHP 5.5以降、bcryptを使いやすい関数として使用できるようになりました。ハッシュを作成するには、password_hash($pass)youを使用します自動的に生成され、ハッシュの内部に配置されるため、ソルトについて心配する必要はありません。これにより、ハッシュをチェックするためにpassword_verify($pass, $hash)を使用する必要があります。ハッシュは毎回異なる塩を使用します(そしてあなたの強さの設定は変わるかもしれません)。

標準のハッシュアルゴリズムよりもはるかに安全であることが証明されているため、これを新しいアプリケーションに使用しない理由はほとんどありません。 PHP 5.5より古いバージョン)を使用している場合、これを支援するために利用できるさまざまなライブラリがあり、最も一般的には ircmaxellのpassword_compat です。

2
Someguy123