有人可以澄清PHP函数crypt()的工作原理吗?

时间:2014-12-02 05:27:40

标签: php password-encryption

从我的理解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_pa​​ssword提交的$ _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

有人可以解释为什么用于验证第一个地址的原始地穴和地穴都具有相同的输出吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

您正在使用Blowfish加密 - 仅使用盐的前22个字符。这是使用河豚的好处之一。

来自PHP manual

  

河豚用盐调和如下:" $ 2a $"," $ 2x $"或者" $ 2y $",一个两位数的成本参数," $",以及字母表中的22个字符" ./ 0-9A-Za-z&#34 ;

这意味着$ existing_hash中的盐最终为$2y$10$MWRmZTkwMTc5ZGJjZDI1N - 与以前完全相同。