理解BCrypt

5
我知道如何编写PHP代码来成功使用BCrypt。所以,我不需要帮助让它工作。 相反,我需要帮助理解BCrypt是如何神奇地工作的!
这个代码中,在第15行,为了验证登录密码是否等于原始密码(现在已经被哈希/加盐),我认为您只是(a)使用登录密码和原始密码(现在已经被哈希/加盐)创建了一个新的哈希/加盐值,然后(b)将(a)中创建的值与原始密码(现在已经被哈希/加盐)进行比较。 我不明白这些如何可能相等,但它们确实相等! 例如,假设用户使用密码test注册,这意味着(为简单起见)已经被哈希/加盐成1234
一天后,用户尝试登录(使用1234),我们需要验证他们。要这样做,我们执行第15行的代码。这意味着我们执行以下操作:
crypt("test", "1234") == "1234"

哈希/加盐技术是如何使用新的盐值(在本例中为1234)来匹配测试文本的呢?

目前为止,这个问题对我来说主要是一个脑力游戏。 ;)


2
那个盐值生成器真是一坨垃圾。 - PeeHaa
1
不是答案,但真的停止使用那些垃圾第三方代码。并且在PHP中使用本地密码哈希API - PeeHaa
看看这个答案,我认为它会让你更好地理解bcrypt哈希是如何组成的:https://dev59.com/EW435IYBdhLWcg3weQBy#10933491 - MaxiWheat
不要将代码拼凑在一起,而是使用 PHP 5.5 引入的密码函数(适用于 PHP >= 5.3.7 的兼容代码可用)。 - Lekensteyn
1个回答

5
Bcrypt哈希算法依赖于密码和盐(像任何哈希算法一样),它是完全确定性的。
如果密码和盐相同,则结果将相同。如果密码或盐更改,则结果也会发生更改。
当使用 crypt($password, $hashedPassword) 时,bcrypt没有使用已哈希的密码作为盐。它从哈希的密码中提取盐,然后使用该盐。 crypt 的结果为 $2y$number$salt-hashedpassword,因此如果您取哈希密码的开头,您将得到原始盐。
请注意,crypt($password, $salt) 的结果以 $salt 的值开头。

非常好的答案。我用了几次,但不理解它是如何工作的。 - Rafael Soufraz
这是一个非常好的答案。它将问题完美地分解了。我的大脑不再疼痛了。谢谢! - filmnut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接