核心要点
password_hash()
用于哈希密码,password_verify()
用于验证密码与其哈希值,password_needs_rehash()
用于检查密码是否需要重新哈希,password_get_info()
用于返回哈希算法的名称和哈希过程中使用的各种选项。password_hash()
函数传递第三个参数来提供自己的盐或成本值。password_compat
的库,该库模拟 API,并在 PHP 版本升级到 5.5 后自动禁用自身。使用 bcrypt 是目前公认的最佳密码哈希实践,但许多开发人员仍在使用 MD5 和 SHA1 等较旧且较弱的算法。一些开发人员甚至在哈希时不使用盐。PHP 5.5 中的新哈希 API 旨在在隐藏其复杂性的同时,将注意力吸引到 bcrypt 上。在本文中,我将介绍使用 PHP 新哈希 API 的基础知识。新的密码哈希 API 公开了四个简单的函数:
password_hash()
– 用于哈希密码。password_verify()
– 用于根据其哈希值验证密码。password_needs_rehash()
– 当需要重新哈希密码时使用。password_get_info()
– 返回哈希算法的名称和哈希过程中使用的各种选项。password_hash()
尽管 crypt()
函数是安全的,但许多人认为它过于复杂且容易出错。然后,一些开发人员使用弱盐和弱算法来生成哈希,例如:
<?php $hash = md5($password . $salt); // 可行,但危险
但是,password_hash()
函数可以简化我们的工作,我们的代码可以保持安全。当您需要哈希密码时,只需将其提供给函数,它将返回可以存储在数据库中的哈希值。
<?php $hash = md5($password . $salt); // 可行,但危险
就是这样!第一个参数是要哈希的密码字符串,第二个参数指定应用于生成哈希的算法。当前默认算法是 bcrypt,但将来某个时候可能会将更强大的算法添加为默认算法,并可能生成更大的字符串。如果您在项目中使用 PASSWORD_DEFAULT
,请确保将哈希存储在容量超过 60 个字符的列中。将列大小设置为 255 可能是一个不错的选择。您也可以使用 PASSWORD_BCRYPT
作为第二个参数。在这种情况下,结果始终为 60 个字符长。这里重要的是,您不必提供盐值或成本参数。新的 API 将为您处理所有这些。盐是哈希的一部分,因此您不必单独存储它。如果要提供自己的盐(或成本),可以通过向函数传递第三个参数(一个选项数组)来实现。
<?php $hash = password_hash($password, PASSWORD_DEFAULT);
通过这种方式,您始终可以使用最新的安全措施。如果 PHP 以后决定实现更强大的哈希算法,您的代码可以利用它。
password_verify()
既然您已经了解了如何使用新的 API 生成哈希,那么让我们看看如何验证密码。请记住,您将哈希存储在数据库中,但在用户登录时获得的是纯文本密码。password_verify()
函数将纯文本密码和哈希字符串作为其两个参数。如果哈希与指定的密码匹配,则返回 true。
<?php $options = [ 'salt' => custom_function_for_salt(), //编写您自己的代码以生成合适的盐 'cost' => 12 // 默认成本为 10 ]; $hash = password_hash($password, PASSWORD_DEFAULT, $options);
请记住,盐是哈希密码的一部分,这就是为什么我们在这里没有单独指定它的原因。
password_needs_rehash()
password_needs_rehash()
有助于检查指定的哈希是否实现了特定算法,并在创建时使用特定选项(如成本和盐)。
<?php if (password_verify($password, $hash)) { // 成功! } else { // 无效的凭据 }
请记住,当用户尝试登录您的网站时,您需要执行此操作,因为这只是您可以访问纯文本密码的时间。
password_get_info()
password_get_info()
接受一个哈希并返回一个包含三个元素的关联数组:
algo
– 一个常量,用于标识特定算法algoName
– 使用的算法的名称options
– 生成哈希时使用的各种选项结论
新的密码哈希 API 比使用 crypt()
函数更容易使用。如果您的网站当前运行在 PHP 5.5 上,那么我强烈建议您使用新的哈希 API。那些使用 PHP 5.3.7(或更高版本)的用户可以使用名为 password_compat
的库,该库模拟 API,并在 PHP 版本升级到 5.5 后自动禁用自身。
PHP 5.5 密码哈希 API 常见问题解答 (FAQ)
PHP 5.5 密码哈希 API 是 PHP 5.5 及更高版本中的一个功能,它为开发人员提供了一种以安全方式哈希和验证密码的简单方法。它很重要,因为它有助于保护敏感的用户数据。如果数据库遭到入侵,哈希密码比纯文本密码更难破解。该 API 默认使用强大的哈希函数 Bcrypt,并自动处理盐值的生成,使开发人员更容易实现安全的密码处理。
password_hash
函数是如何工作的?password_hash
函数是 PHP 5.5 密码哈希 API 的一部分。它接收纯文本密码和哈希算法作为输入,并返回一个哈希密码。该函数还在哈希之前自动生成并应用一个随机盐值到密码。此盐值包含在返回的哈希中,因此无需单独存储它。
password_verify
函数的目的是什么?password_verify
函数用于根据哈希密码验证密码。它接收纯文本密码和哈希密码作为输入。该函数从哈希密码中提取盐值和哈希算法,将它们应用于纯文本密码,然后将结果与原始哈希密码进行比较。如果匹配,则该函数返回 true,表明密码正确。
PHP 5.5 密码哈希 API 被认为非常安全。它默认使用 Bcrypt 哈希算法,这是一个强大的哈希函数。该 API 还自动为每个密码生成并应用一个随机盐值,这有助于防止彩虹表攻击。但是,与所有安全措施一样,它并非万无一失,应将其作为全面安全策略的一部分使用。
password_hash
函数中使用自定义盐吗?是的,您可以在 password_hash
函数中使用自定义盐,但不推荐这样做。该函数会自动为每个密码生成一个随机盐值,这通常比自定义盐更安全。如果您确实选择使用自定义盐,它应该是一个至少 22 个字符的随机字符串。
password_hash
函数中的成本参数是什么?password_hash
函数中的成本参数决定了哈希的计算成本。较高的成本使哈希更安全,但也计算速度较慢。默认成本为 10,对于大多数应用程序来说,这是安全性和性能之间的良好平衡。
您可以使用 password_needs_rehash
函数来检查哈希密码是否需要重新哈希。此函数接收哈希密码、哈希算法以及可选的成本作为输入。如果哈希密码是用不同的算法或成本创建的,则返回 true,表明它应该重新哈希。
PHP 5.5 密码哈希 API 仅在 PHP 5.5 及更高版本中可用。但是,有一个兼容性库可为 PHP 5.3.7 及更高版本提供相同的功能。
PASSWORD_DEFAULT
常量哈希密码,然后 PHP 的未来版本中的默认算法发生更改会发生什么?如果您使用 PASSWORD_DEFAULT
常量哈希密码,然后 PHP 的未来版本中的默认算法发生更改,password_hash
函数将继续按预期工作。哈希密码包含有关所用算法的信息,因此 password_verify
函数仍然可以正确验证密码。
是的,您可以将 PHP 5.5 密码哈希 API 与非 ASCII 密码一起使用。password_hash
和 password_verify
函数使用二进制数据,因此它们可以处理任何字符的密码。但是,您应该注意,不同的系统可能对非 ASCII 字符的处理方式不同,因此在哈希密码之前对其进行规范化是一个好主意。
以上是带有PHP 5.5密码哈希API的哈希密码的详细内容。更多信息请关注PHP中文网其他相关文章!