根据我的理解,crypt( string,salt),拿出盐,把它钉在字符串参数的加密版本的前面。
$pw = "secret";
$format_and_salt = $2y$10$MWRmZTkwMTc5ZGJjZDI1NT;
$hash = crypt($pw, $format_and_salt);$hash作为$2y$10$MWRmZTkwMTc5ZGJjZDI1NOfGsQUgIu7ezETpe.uHjGqbmdrw2.vqm存储到数据库列hashed_password中
或者被分解:
第一部分是$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
有人能解释一下为什么原始的加密和上面用来验证第一个的加密都有相同的输出吗?提前谢谢。
发布于 2014-12-02 13:35:17
您正在使用Blowfish加密-仅使用盐的前22个字符。这是使用河豚的好处之一。
Blowfish使用盐进行散列,如下所示:"$2a$","$2x$“或"$2y$",两位数成本参数,"$",以及字母表"./0-9A-Za-z”中的22个字符。
这意味着来自$existing_hash的盐最终是$2y$10$MWRmZTkwMTc5ZGJjZDI1N -与之前完全相同。
https://stackoverflow.com/questions/27242464
复制相似问题