33

ユーザーのパスワードを保存したいとします。これは、PHP 5.5 のpassword_hash()関数 (または PHP 5.3.7+ のこのバージョン: https://github.com/ircmaxell/password_compat ) でそれを行う正しい方法でしょうか?

$options = array("cost" => 10, "salt" => uniqid());
$hash = password_hash($password, PASSWORD_BCRYPT, $options);

それから私はするだろう:

mysql_query("INSERT INTO users(username,password, salt) VALUES($username, $hash, " . $options['salt']);

データベースに挿入します。

次に確認します。

$row = mysql_fetch_assoc(mysql_query("SELECT salt FROM users WHERE id=$userid"));
$salt = $row["salt"];
$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10, "salt" => $salt));

if (password_verify($password, $hash) {
    // Verified
}
4

4 に答える 4

59

データベース ステートメントに関する問題は今のところ無視して、 に関する質問にお答えしますpassword_hash

要するに、いいえ、それはあなたのやり方ではありません。ソルトだけを保存するのではなく、ハッシュとソルトの両方を保存し、両方を使用してパスワードを確認する必要があります。password_hash両方を含む文字列を返します。

このpassword_hash関数は、ハッシュとソルトの両方を含む文字列を返します。そう:

$hashAndSalt = password_hash($password, PASSWORD_BCRYPT);
// Insert $hashAndSalt into database against user

次に確認します。

// Fetch hash+salt from database, place in $hashAndSalt variable
// and then to verify $password:
if (password_verify($password, $hashAndSalt)) {
   // Verified
}

さらに、コメントが示唆するように、セキュリティに興味がある場合は、mysqli( ext/mysqlPHP5.5 では非推奨になっています) と、SQL インジェクションに関するこの記事: http://php.net/manual/en/securityも参照してください。 .database.sql-injection.php

于 2013-02-21T00:28:04.590 に答える
11

独自のソルトを使用することはお勧めできません。PHP 7 以降、その使用は推奨されていません。理由を理解するために、著者はpassword_hashこれらの考えを共有しました(リンクは無効です)

1 つのことが非常に明確になりました: 塩のオプションは危険です。私はまだまともなソルトオプションの使い方を見たことがありません。すべての使用法は、悪い (mt_rand() 出力を渡す) から危険な (静的文字列) から非常識 (パスワードを独自のソルトとして渡す) までさまざまです。

ユーザーがソルトを指定できるようにするべきではないと思うという結論に達しました。

はSOチャットでこのコメントをして、自分の塩を渡すことがどれほど悪いかを指摘しました

于 2015-09-14T22:44:41.603 に答える
7

php.netからこれに注意してください

警告

salt オプションは、PHP 7.0.0 で非推奨になりました。デフォルトで生成されるソルトを単純に使用することが推奨されるようになりました。

結論?塩のオプションを忘れてください。

これで十分password_hash('password', PASSWORD_DEFAULT)です *(or _BCRYPT)

于 2015-09-03T01:01:31.740 に答える