【问题标题】:How to use Taylor Hornby's password hashing functions如何使用 Taylor Hornby 的密码散列函数
【发布时间】:2014-08-26 02:33:44
【问题描述】:
我一直在阅读有关密码哈希的信息。我真的不擅长 php。谁能告诉我如何使用 Taylor Hornby 的密码哈希函数,如 here?
【问题讨论】:
标签:
php
security
passwords
password-hash
【解决方案1】:
您将首先包含 PHP 文件,您可以看到如何做到这一点here。您还需要自定义文件以匹配您想要使用的哈希函数。 sha256 会是一个不错的选择。
然后您将使用您的密码运行create_hash 函数,并将返回的值存储到您的数据库中。
要验证密码,您需要运行validate_password 函数,使用来自数据库的哈希和用户输入的密码。您不需要使用的另外两个函数 validate_password 和 create_hash 使用您需要的所有参数为您运行这些函数。
密码学很复杂,可能会令人困惑,因此最好在存储密码等机密信息之前先了解一下安全性,因为设置错误可能意味着您的密码存储不安全。 This page 提供了一些关于如何安全存储密码的技术细节。
【解决方案2】:
您链接到的类实现了一个很好的算法 (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);
请改用此函数,即使链接的实现似乎做得很好。