如何在PHP中使用crypt($ pass,'$ 2y $ 09 $ salt')=== crypt($ pass,crypt($ pass,'$ 2y $ 09 $ salt'))?

问题描述 投票:4回答:2

我确实对crypt()PHP函数感到困惑。

当第二个crypt显然使用不同的第二个参数时,以下两个crypt函数如何提供相同的输出? Diff salt意味着diff hash对吧?

echo crypt("password", '$2y$09$anexamplestringforsalt$')."\n<br>";
echo crypt("password", crypt("password", '$2y$09$anexamplestringforsalt$'))."\n<br>";

输出:

$2y$09$anexamplestringforsale/.K.VdgECUVEd9N4ja3u1WtgPi5BXZq 
php hash blowfish crypt
2个回答
11
投票

原因是因为salt是crypt提供的哈希输出的一部分。

$2y$09$anexamplestringforsale/.K.VdgECUVEd9N4ja3u1WtgPi5BXZq 

这分为几个部分:

  • 2y - 算法标识符(bcrypt)
  • 09 - 成本参数
  • anexamplestringforsale - 盐
  • /.K.VdgECUVEd9N4ja3u1WtgPi5BXZq - 哈希

这导致了良好的属性,只是能够直接使用结果哈希作为验证调用中的salt。

$hash = crypt($password, $salt);

if ($hash === crypt($password, $hash)) {

现在您不需要分别存储算法,成本或盐。只需将它们直接存储在哈希结果中即可。简单。

此外,我强烈建议您使用简化密码哈希API,旨在专门缓解这些问题:password_hash()


0
投票

如果你使用BlowFish算法,你的代码最终会遇到这个函数:BF_crypt(源代码)

声明:

static char *BF_crypt(const char *key, const char *setting,
char *output, int size,
BF_word min)

关键是$ str,设置是php函数string crypt ( string $str [, string $salt ] )的$ salt,输出将是加密的返回值。

正如您在源代码中看到的:

首先,在第777行,memcpy(output, setting, 7 + 22 - 1);,这行将$ salt的前29个字符(从pos 0到pos 7 + 22 -1)复制到返回值,即$2y$09$anexamplestringforsale

其次,$ salt的遗体从未被使用过。

第三,在第784行,BF_encode(&output[7 + 22], data.binary.output, 23);,将加密的字符串附加在返回值上。

因此,$ str和$ salt的前29个字符是影响您的返回值的因素。

© www.soinside.com 2019 - 2024. All rights reserved.