我正在研究在数据库中加密和存储用户密码以进行登录的最佳和最安全的方法。我遇到的一篇文章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()
返回的编译哈希给出了以冒号分隔的值列表。我只是不确定从这里开始,或者这个源代码是否值得使用。
答案 0 :(得分: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
}
答案 1 :(得分:1)
要验证登录信息,请使用您发布的链接上的以下功能,$password
是尝试登录的用户输入的密码,$good_hash
为PBKDF2_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
)
);
}