密码是mySQL
数据库应以散列形式保存
echo password_hash('test', PASSWORD_BCRYPT);
给我们
$2y$10$8PxsFGPbGtgYb44GRPL84ev2T0xR0LXMSSKm7cuSBUbAU114mosFG
或
$2y$10$E.q3bVE9EE2ce2VaKPJgtuwEMRZxpTYiQR6Mw2dmLGqeKx/PsQY42
或。 。 。
但是,所有这些$2y$10. . .
字符串都可以使用test
轻松解密回password_verify
。
假设有人可以访问哈希密码,那么她可以使用password_verify
解密它们吗?一旦有人拥有字符串$2y$10$E.q3bVE9EE2ce2VaKPJgtuwEMRZxpTYiQR6Mw2dmLGqeKx/PsQY42
,他或她就可以轻松地将其转换回纯文本,对吧?那么为什么要使用密码呢?
答案 0 :(得分:6)
本声明
但所有这些都是2美元10美元。 。 。使用password_verify可以轻松地将字符串解密回测试。
不是真的。
因为password_hash()
是单向散列。
这意味着(实际上)无法从散列字符串返回到原始字符串。
password_verify()
不解密哈希(因为它不可能)。更简单的是,它会对要验证的密码进行哈希处理,并检查生成的哈希值是否与提供的密码匹配。
答案 1 :(得分:3)
您似乎对数据的来源以及password_verify
函数的含义存在误解。在“解密”期间,您传入哈希应该表示的实际密码。必须知道密码才能进行验证。
password_verify
的作用是使用与给定哈希值相同的方法对您再次提供的密码进行哈希处理,并检查两者是否匹配。
因此无法使用password_verify
轻松反转哈希值。您必须通过密码强制查找与哈希匹配的密码。
注意:如果我们谈论密码哈希,这不能称为加密,因为它是单向的,加密会有相应的解密功能。