当前位置: 首页 > 知识库问答 >
问题:

PHP的password_hash和password_verify功能是否足够?

林烨烨
2023-03-14

我正在建立一个有用户的网站,和大多数包含一些用户类型系统的网站一样,他们用他们的电子邮件和密码登录。我使用PHP为我的网站的后端部分。

在阅读了互联网上的一些文章和帖子后,我了解了PHP函数password_hash()和password_verify(),并想知道像这样的示例过程是否足够安全

  1. 注册用户,password_hash他们的密码,并将散列存储在数据库中。
  2. 登录时,使用password_verify()验证密码并登录。
  3. 如果他们想更改密码,获取他们的输入并再次password_hash输入。

因此,我的问题如下:

  1. password\u hash()和password\u verify()是我唯一需要的函数吗
  2. 我可以接受原始用户输入并使用password_hash()安全地散列密码以存储在数据库中吗

如有任何答复,将不胜感激。非常感谢。

共有2个答案

罗寒
2023-03-14

password_hash()password_verify()在BCrypt algo中使用这些函数就足够了。BCrypt是现在最安全的算法-一天散列密码。BCrypt是PHP 5.5.0的默认算法,因此您可以使用PASSWORD_DEFAULT来使用BCrypt。password_hash()为每个密码自动生成盐,所以我建议不要使用自己的盐,让password_hash()为你做,并设置CPU成本最低12

曹均
2023-03-14

这两个问题都是肯定的,但有几点需要注意:

>

password_hash(hash('sha512', $_POST['password'], true), PASSWORD_DEFAULT);

password_verify(hash('sha512', $_POST['password'], true), $storedHash);

Bcrypt在NUL字节上断开,这意味着如果密码的SHA512散列以00开头,破解散列的攻击者会将其视为空字符串的Bcrypt散列。

如果您希望接受长度超过72个字符的密码而不进行静默截断,请执行我们在password_lock:base-64中所做的操作,在散列和验证期间对原始散列输出进行编码。

(password_lock执行的密码散列的身份验证加密是可选的,并且仅当您的数据库位于与Web服务器不同的硬件上时,才能提高安全性。)

但如果您只是接受用户的密码,bcrypt就可以了。大多数人的72个字符的密码无论如何都是不可破解的。

 类似资料:
  • 问题内容: 我的注册脚本接受用户的密码,然后使用PHP的password_hash函数对密码进行加密,然后将其放入数据库中。当我使用刚刚创建的用户登录时,出现了检查密码是否相同的错误。就我而言,不是。在登录脚本中调用password_verify函数时,我在做什么错? 寄存器 登录 这是我执行var_dump时得到的: 很明显,密码没有匹配在一起。因此,在注册脚本上,密码被散列并发送到数据库。然后

  • 问题内容: 在我的登录PHP文件中,有这些 在我的PHP注册文件中,有这个。 现在,从本质上讲,我这样做是为了使它散列密码,并在注册时将其自身插入数据库中。这样做。 但是,它无法验证它。两种结果都给出2个不同的哈希值,我不知道自己可能做错了什么。我还尝试只是使其再次哈希输入,然后检查数据库中的password_hash,但这没有用。 使用这些的正确方法是什么? (同样,$ passSign和$ u

  • 问题内容: 假设我想为用户存储密码,这是使用PHP 5.5的功能(或针对PHP 5.3.7+的该版本:https : //github.com/ircmaxell/password_compat)的正确方法吗? 然后我会做: 插入数据库。 然后进行验证: 问题答案: 现在忽略数据库语句的问题,我将回答有关的问题。 简而言之,不,这不是您的方式。您不想单独存储盐,应该同时存储哈希和盐,然后使用两者来

  • 我一直在研究加密密码的最佳方法,我决定继续使用BCRYPT,只是因为每次加密的成本和它通常被认为是目前最好的加密方法之一。 我使用的是双向盐,所以每个用户都有一个独特的盐,然后显然盐存储在我的应用程序中,我注意到一些相当奇怪的行为…根据PHP文档,这种行为是正常的吗? 不管怎样,下面是我使用的代码: 现在,Crypto类: 所以,我感兴趣的是,为什么这个函数只是在输出字符串的开头添加选项中的sal

  • 我正在考虑使用password_hash()函数来加密用户密码。据我所知,如果您不提供salt,这个函数将默认生成salt,甚至鼓励您使用默认的salt而不是您自己的salt。我目前正在权衡3个选择,不能决定哪一个去,所以如果你能帮助我,我会很感激。 1.选项:password_hash()和默认salt 2.选项:带有自定义盐的password_hash() 3.选项:根本不使用password

  • 问题内容: 如何检查jQuery中元素的存在? 我当前的代码是这样的: 有没有更优雅的方式来解决这个问题?也许是插件还是功能? 问题答案: 在JavaScript中,一切都是“真实的”或“虚假的”,对于数字(和NaN)而言,一切都是其他。所以你可以这样写: 您不需要那部分。