php - 使用 PHP 5.5 的 password_hash 和 password_verify 函数

标签 php mysql hash passwords php-password-hash

假设我想为用户存储密码,这是否是使用 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
}

最佳答案

暂时忽略你的数据库语句的问题,我将回答有关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/mysql 在 PHP5.5 中已弃用),还有这篇关于 SQL 注入(inject)的文章:http://php.net/manual/en/security.database.sql-injection.php

关于php - 使用 PHP 5.5 的 password_hash 和 password_verify 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14992367/

相关文章:

php - 如何使用 PHP 向多个用户发送消息

php - 防止 XSS - 用户提供部分 url

mysqldump 使用数据库名称完全限定触发器

Ruby 散列活生生的怪异

c++ - 如何更改 std::hash<> 中的默认种子?

php - 将 3 小时添加到 php 中 new Cassandra\Timestamp() 生成的时间戳中

php - 中间件中的 Laravel 依赖注入(inject)

php - yii 框架中的主题和布局

c# - ASP.net 找不到连接字符串

linux - 将 CD 文件上的 sha256sum 输出到文本文件