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

Gum*_*tic 9 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()来获取原始用户输入安全地散列密码以存储在数据库中吗?

任何答案都将非常感激.谢谢.

Sco*_*ski 6

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

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

    password_hash(hash('sha512', $_POST['password'], true), PASSWORD_DEFAULT);
    
    password_verify(hash('sha512', $_POST['password'], true), $storedHash);
    
    Run Code Online (Sandbox Code Playgroud)
  2. Bcrypt在NUL字节上中断,这意味着如果密码的SHA512哈希开头00,攻击者破解哈希将把它看作空字符串的bcrypt哈希.

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

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

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