php - PHP 的 password_hash 和 password_verify 函数够用吗?

标签 php database security

我正在构建一个有用户的网站,并且与大多数拥有某种用户类型系统的网站一样,他们使用他们的电子邮件和密码登录>。我在网站的后端部分使用 PHP

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

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

所以我的问题是如下:

  1. password_hash() 和 password_verify() 是我需要的唯一函数吗?
  2. 我能否采用原始用户输入并使用password_hash()安全地散列密码以存储在数据库?

任何答案将不胜感激。谢谢。

最佳答案

对这两个问题都是肯定的,但有一些注意事项:

  1. Bcrypt 在 72 个字符后截断。虽然这不会以任何实际方式降低安全性,但它仍然会在某些人的口中留下不好的印象。人们通常通过这样的哈希函数传递它来解决这个问题(请阅读第二个警告!):

    password_hash(hash('sha512', $_POST['password'], true), PASSWORD_DEFAULT);
    
    password_verify(hash('sha512', $_POST['password'], true), $storedHash);
    
  2. Bcrypt 在 NUL 字节处中断,这意味着如果您密码的 SHA512 散列以 00 开头,破解散列的攻击者会将其视为空字符串的 bcrypt 散列。

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

(password_lock 执行的经过身份验证的密码散列加密是可选的,只有当您的数据库与网络服务器位于不同的硬件上时才会提高安全性。)

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

关于php - PHP 的 password_hash 和 password_verify 函数够用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021218/

相关文章:

angularjs - MEANJS:SocketIO 中的安全性

python - 使用 Python 在 Windows 上获取目录所有权会导致 "Access denied"错误

php - 如何在 PHP session 中存储照片上传?

javascript - 在 JavaScript Electron 桌面应用程序中存储大量关系数据?

java - 使用 groovy actor 最大化数据库的吞吐量?

php - 如何合并两个具有相同字段但数据不重复的数据库?

PHP 5.6 漏洞 CVE-2018-7584

php - 使用 MySQL 的原则

php - 如何使用mPDF生成PDF并向其中添加自定义Google字体?

php - 根据其他字段的值自动更新mysql字段