0

重複の可能性:
PHPでパスワードをハッシュするためにbcryptをどのように使用しますか?

私は、ログイン用のデータベースにユーザーパスワードを暗号化して保存するための最良かつ最も安全な方法を研究しています。私が出会った1つの記事、Salted Password Hashing-Doing it Rightは、パスワードを暗号化およびチェックするためのかなり複雑に見える一連の関数を提供します。

コードがどのように機能するかは理解していますが、この記事では、ハッシュ化されたパスワードをデータベースに保存するだけでなく、ソルトも保存することについても言及しています。与えられたコードを使用して、それをどのように行うのですか?例えば:

// User registers with username and password; assume they're already validataed
$hash = create_hash($password_entered);
$password_hash = $hash[HASH_PBKDF2_INDEX];
$salt = $hash[HASH_SALT_INDEX];

$PDO = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
$statement = $PDO->prepare('INSERT INTO users (username, password, user_salt)
    VALUES (:username, :password; :user_salt)');
$statement->execute(array(
    ':username'  => $username_entered,
    ':password'  => $password_hash,
    ':user_salt' => $salt,
));

それは正しいようです...しかし、ログインを確認するとき、ログインフォームから入力されたパスワードに対して何をチェックするべきかわかりません。によって返されるコンパイル済みハッシュcreate_hash()は、コロンで区切られた値のリストを提供します。ここからどこへ行くのか、あるいはこのソースコードを使う価値があるのか​​どうかはわかりません。

4

2 に答える 2

1

私はこのコードを使用していませんが、user_saltをユーザーテーブルの列に個別に保存するべきではないと確信しています。ユーザーソルトはハッシュに含まれます(コロンで区切られたハッシュの位置3)。ログインスクリプトで、ユーザーが入力したパスワードを取得し、次の関数を呼び出します。

// here run a query and get the hashed password from the users table and put the
// hashed value in $hashed_password_from_database
// $user_enetered_password usually comes from $_POST

if (validate_password($user_entered_password, $hashed_password_from_database)) {
  // login successful
} else {
  // login failed
}
于 2012-12-19T21:33:56.803 に答える
1

ログインを確認するには、投稿したリンクにある次の関数を使用します。この関数は、ログイン$passwordしようとしているユーザーが入力したパスワードであり$good_hashPBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" . $salt_from_db . ":" . $hash_from_db

function validate_password($password, $good_hash)
{
    $params = explode(":", $good_hash);
    if(count($params) < HASH_SECTIONS)
       return false;
    $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]);
    return slow_equals(
        $pbkdf2,
        pbkdf2(
            $params[HASH_ALGORITHM_INDEX],
            $password,
            $params[HASH_SALT_INDEX],
            (int)$params[HASH_ITERATION_INDEX],
            strlen($pbkdf2),
            true
        )
    );
}
于 2012-12-19T21:34:49.033 に答える