我一直在阅读有关密码哈希的信息。我真的不擅长 php。谁能告诉我如何使用 Taylor Hornby 的密码哈希函数,如此处所示?
3 回答
您链接到的类实现了一个很好的算法(PBKDF2)来散列密码,但是在 PHP 中这样的实现存在一个大问题。
密码的适当散列算法包括一个成本因素,您可以使用它来控制计算散列值的必要时间。成本值越高,进行的散列次数就越多。由于 PHP 比原生 C 实现慢,并且您不想等待几秒钟的登录,因此您将执行更少的散列轮次。这削弱了密码哈希,一个可以使用GPU的破解工具将具有很大的优势。
这就是 PHP 提供BCrypt 算法的本机实现password_hash()的原因:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
请改用此函数,即使链接的实现似乎做得很好。
您将首先包含 PHP 文件,您可以在此处查看如何执行此操作。您还需要自定义文件以匹配您想要使用的哈希函数。sha256 将是一个不错的选择。
然后,您将使用您的密码运行该create_hash
函数,并将返回的值存储到您的数据库中。
要验证密码,您将运行该validate_password
函数,使用来自数据库的哈希和用户输入的密码。您不需要使用其他两个函数,validate_password
并使用create_hash
您需要的所有参数为您运行这些函数。
密码学很复杂,可能会让人困惑,因此在存储密码等机密信息之前先了解一下安全性是个好主意,因为设置错误可能意味着您的密码存储不安全。此页面提供了有关如何安全存储密码的一些技术细节。
在看到这个问题并与 defuse 讨论之后,我提交了他的密码哈希类的第一个示例。更多内容取决于需求和空闲时间:
https://github.com/defuse/password-hashing/tree/master/examples