核心要点
- 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_hash
和 password_verify
函数使用二进制数据,因此它们可以处理任何字符的密码。但是,您应该注意,不同的系统可能对非 ASCII 字符的处理方式不同,因此在哈希密码之前对其进行规范化是一个好主意。
以上是带有PHP 5.5密码哈希API的哈希密码的详细内容。更多信息请关注PHP中文网其他相关文章!

phpientifiesauser'ssessionusessessionSessionCookiesAndSessionIds.1)whiwSession_start()被称为,phpgeneratesainiquesesesessionIdStoredInacookInAcookInamedInAcienamedphpsessidontheuser'sbrowser'sbrowser.2)thisIdAllowSphptptpptpptpptpptortoreTessessionDataAfromtheserverMtheserver。

PHP会话的安全可以通过以下措施实现:1.使用session_regenerate_id()在用户登录或重要操作时重新生成会话ID。2.通过HTTPS协议加密传输会话ID。3.使用session_save_path()指定安全目录存储会话数据,并正确设置权限。

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

利用会话构建高效购物车系统的步骤包括:1)理解会话的定义与作用,会话是服务器端的存储机制,用于跨请求维护用户状态;2)实现基本的会话管理,如添加商品到购物车;3)扩展到高级用法,支持商品数量管理和删除;4)优化性能和安全性,通过持久化会话数据和使用安全的会话标识符。

本文讨论了PHP中的crypt()和password_hash()之间的差异,以进行密码哈希,重点介绍其实施,安全性和对现代Web应用程序的适用性。

文章讨论了通过输入验证,输出编码以及使用OWASP ESAPI和HTML净化器之类的工具来防止PHP中的跨站点脚本(XSS)。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3汉化版
中文版,非常好用

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境