从我的理解crypt(string,salt)中取盐,将其粘贴到字符串参数的加密版本的前面。
$pw = "secret";
$format_and_salt = $2y$10$MWRmZTkwMTc5ZGJjZDI1NT;
$hash = crypt($pw, $format_and_salt);
$ hash作为hashed_password
$2y$10$MWRmZTkwMTc5ZGJjZDI1NOfGsQUgIu7ezETpe.uHjGqbmdrw2.vqm
或细分:
第一部分是$ format_and_salt:$2y$10$MWRmZTkwMTc5ZGJjZDI1N (sans the 'T')
+
第二部分是加密的$ pw:OfGsQUgIu7ezETpe.uHjGqbmdrw2.vqm
如果我再次使用crypt来验证用户针对数据库中存储的hashed_password提交的$ _POST密码,则两种情况的输出似乎都不能反映我上面描述的逻辑。所以我错过了一些东西。
那么:
$existing_hash = $admin['hashed_password']
($ admin是最终从查询派生的数组)。
和
crypt($pw, $existing_hash)
返回$2y$10$MWRmZTkwMTc5ZGJjZDI1NOfGsQUgIu7ezETpe.uHjGqbmdrw2.vqm
与上面的$hash
相同。这可以验证或无效提交给$ _POST的用户,但如上所述,如果我按照上面第一个crypt()的逻辑,我会期望:
第一部分是$ existing_hash:$2y$10$MWRmZTkwMTc5ZGJjZDI1NOfGsQUgIu7ezETpe.uHjGqbmdrw2.vqm
+
第二部分是加密的$ pw:OfGsQUgIu7ezETpe.uHjGqbmdrw2.vqm
我期望合并为:
$2y$10$MWRmZTkwMTc5ZGJjZDI1NOfGsQUgIu7ezETpe.uHjGqbmdrw2.vqmOfGsQUgIu7ezETpe.uHjGqbmdrw2.vqm
有人可以解释为什么用于验证第一个地址的原始地穴和地穴都具有相同的输出吗?提前谢谢。
答案 0 :(得分:2)
您正在使用Blowfish加密 - 仅使用盐的前22个字符。这是使用河豚的好处之一。
来自PHP manual:
河豚用盐调和如下:" $ 2a $"," $ 2x $"或者" $ 2y $",一个两位数的成本参数," $",以及字母表中的22个字符" ./ 0-9A-Za-z&#34 ;
这意味着$ existing_hash中的盐最终为$2y$10$MWRmZTkwMTc5ZGJjZDI1N
- 与以前完全相同。