使用 Password_hash 和 password_verify

Working with Password_hash and password_verify

我是 password_hashpassword_verify 的新手,它们似乎是安全存储密码的最有效方式!

我注意到 password_hash 为相同的 plain-text 值生成不同的哈希值 every time

这意味着如果用户尝试使用密码 (thisIsMyPassword) 创建帐户,它将生成这样的哈希 y$VCNH8ndve8hwbvLJ2nMHtOsEiigE4zA7ViADxCJfq9bmUCmkNkcce

并且如果另一个或同一个用户试图使用相同的密码创建另一个帐户,即 (thisIsMyPassword) 将创建该帐户并且密码的哈希值将类似于 y$Hqssc5nn3pzgfwqVwQrQz.Ny71q972RXmCmyV9ykywG8iELbsf47a

现在您看到了相同的值,即 (thisIsMyPassword) 产生了不同的哈希值!

这样可以吗?

只要数据库中的密码散列不同,就可以让用户使用相同的密码吗?

密码散列包括一个所谓的salt,一个小的随机值,这是为了防止字典攻击,这里是PHP手册说的:

If omitted, a random salt will be generated by password_hash() for each password hashed. This is the intended mode of operation.

您作为输出获得的值并不是真正的普通散列,而是一个 字符串由 - algorithm id, salt 和 HASH(password,salt).

The used algorithm, cost and salt are returned as part of the hash. Therefore, all information that's needed to verify the hash is included. in it. This allows the password_verify() function to verify the hash without needing separate storage for the salt or algorithm information.