0

可能重复:
如何在 PHP 中使用 bcrypt 对密码进行哈希处理?

我正在研究将用户密码加密并存储在数据库中以进行登录的最佳和最安全的方法。我遇到的一篇文章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 单独保存在用户表的列中。用户 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 回答