首页 > 后端开发 > php教程 > 带有PHP 5.5密码哈希API的哈希密码

带有PHP 5.5密码哈希API的哈希密码

Jennifer Aniston
发布: 2025-02-23 10:19:09
原创
349 人浏览过

Hashing Passwords with the PHP 5.5 Password Hashing API

核心要点

  • PHP 5.5 密码哈希 API 通过四个函数简化了密码哈希:password_hash() 用于哈希密码,password_verify() 用于验证密码与其哈希值,password_needs_rehash() 用于检查密码是否需要重新哈希,password_get_info() 用于返回哈希算法的名称和哈希过程中使用的各种选项。
  • 该 API 默认使用 bcrypt 算法,并自动处理盐值的生成,无需开发人员提供。但是,开发人员仍然可以通过向 password_hash() 函数传递第三个参数来提供自己的盐或成本值。
  • 该 API 被认为非常安全,但建议将其作为全面安全策略的一部分使用。使用 PHP 5.3.7 或更高版本的开发人员可以使用名为 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()

如果需要修改哈希字符串的盐和成本参数怎么办?这是一个需要关注的问题,因为您可能决定通过添加更强的盐或更大的成本参数来提高安全性。此外,PHP 可能会更改哈希算法的默认实现。在所有这些情况下,您都希望重新哈希现有密码。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 是 PHP 5.5 及更高版本中的一个功能,它为开发人员提供了一种以安全方式哈希和验证密码的简单方法。它很重要,因为它有助于保护敏感的用户数据。如果数据库遭到入侵,哈希密码比纯文本密码更难破解。该 API 默认使用强大的哈希函数 Bcrypt,并自动处理盐值的生成,使开发人员更容易实现安全的密码处理。

password_hash 函数是如何工作的?

password_hash 函数是 PHP 5.5 密码哈希 API 的一部分。它接收纯文本密码和哈希算法作为输入,并返回一个哈希密码。该函数还在哈希之前自动生成并应用一个随机盐值到密码。此盐值包含在返回的哈希中,因此无需单独存储它。

password_verify 函数的目的是什么?

password_verify 函数用于根据哈希密码验证密码。它接收纯文本密码和哈希密码作为输入。该函数从哈希密码中提取盐值和哈希算法,将它们应用于纯文本密码,然后将结果与原始哈希密码进行比较。如果匹配,则该函数返回 true,表明密码正确。

PHP 5.5 密码哈希 API 的安全性如何?

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 一起使用吗?

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 密码一起使用吗?

是的,您可以将 PHP 5.5 密码哈希 API 与非 ASCII 密码一起使用。password_hashpassword_verify 函数使用二进制数据,因此它们可以处理任何字符的密码。但是,您应该注意,不同的系统可能对非 ASCII 字符的处理方式不同,因此在哈希密码之前对其进行规范化是一个好主意。

以上是带有PHP 5.5密码哈希API的哈希密码的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板