1

私は、mysql DB 内のユーザー テーブルに格納されているハッシュとソルトについて学習しようとしています。それらを保存することはできますが、ユーザーがログインしたときに検証する方法に頭を悩ませているようには見えません。
ソルトとハッシュを別々に、または一緒に保存することについて調べて見ました。私が生産している塩はランダムです。

何か案は?
私は自分のコードを投稿しました。

<?php
$password = 'passwordwhatever';

//generate the salt
function gen_salt() {
    $salt = uniqid(mt_rand(), true) . sha1(uniqid(mt_rand(), true));
    $salt = crypt('sha512', $salt);
    return $salt;
}

//generate the hash
function gen_hash($salt, $password) {
    $hash = $salt . $password;
    for($i = 0; $i < 100000; $i++) {
        $hash = crypt('sha512', $hash);
    }

    $hash = $salt . $hash;
    return $hash;
}

$password = gen_hash(gen_salt(), $password);
echo $password;

?>
4

3 に答える 3

2

同じ塩を生産する限り、それほど問題にはなりません。取得できる限り、構成内のデータベースに保存してください。SHA512 ハッシュを元に戻す作業は非常に手間がかかるため、ペンタゴンでない限り誰も気にしません。ポイントは、同じソルトでハッシュを繰り返すことができるようにすることです。これにより、機密性の高い入力を保存しなくても、入力が同じであることを確信できます。それが理にかなっていれば。

于 2012-06-05T00:51:20.807 に答える
1

ソルトは、データベース内のどこかに (またはどこかに) 含まれている必要があります。一部のオプションは、ソルトをハッシュに追加するか、独自のフィールドとして保存することです。ハッシュに追加するのが好きです。

$password = $salt . '.' . $hash;

次に、ユーザーがログインすると、パスワードを取得し、それをハッシュとソルトに分割し、パスワード生成関数を使用して (ランダム ソルトではなくパスワードからのソルトを使用)、デシベル。

list($salt,$hash) = explode('.', $password);
$check = gen_hash($salt, $input_pass);
if ($check === $password)
    // valid
于 2012-06-05T00:48:43.180 に答える
0

たぶん、 bcryptを見てください。これはあなたを助けるかもしれません。いくつかのチュートリアルを書きましたが、それらはドイツ語です。ああ、PHP 5.3 は bcrypt をネイティブにサポートしています。

于 2012-06-05T00:51:43.973 に答える