PHP crypt()在失败时返回13,且不少于13个字符

时间:2014-08-21 20:07:56

标签: php return-value crypt

PHP crypt()函数的手册(http://php.net/manual/en/function.crypt.php)中说明了它......

  

返回散列字符串或短于13的字符串   字符并保证与失败时的盐不同。

但是,以下示例中,我以错误的方式使用crypt()前缀中的 rounds 参数,表明该函数在失败时也可能返回13个字符的哈希值。不应该手动说明字符串等于或短于13个字符失败,或者我没有得到什么?

$password_to_encode = "foo";
$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$error_hash = crypt($password_to_encode, 'rounds=10000$6$'.$iv);
echo 'Error hash: '.$error_hash.', length: '.strlen($error_hash)."<br>";

$correct_hash = crypt($password_to_encode, '$6$rounds=10000$'.$iv);
echo 'Correct hash: '.$correct_hash.', length: '.strlen($correct_hash)."<br>";

输出:

Error hash: rod2rRfdXBWy6, length: 13
Correct hash: $6$rounds=10000$¦yû*®gص=ºåé...NFk.5mrB07OM//, length: 119

(正确的哈希缩写)

2 个答案:

答案 0 :(得分:2)

您的“不正确”哈希被识别为标准的双字符DES哈希;后续字符将被忽略。 crypt()基本上是基于你的盐计算算法,但是看到一个不正确的SHA512盐,它看到了正确的DES盐,因为前两个字符是有效的DES盐。

关于发生了什么的重要线索在manual

  

标准的基于DES的crypt()返回salt作为输出的前两个字符。它也只使用str的前八个字符,所以较长的字符串以相同的八个字符开头将产生相同的结果(当使用相同的盐时)。

请注意,您的“错误”输出以与盐相同的两个字符开头 - 在这种情况下实际上是整个盐。

所以,实际上,你实际上得到的是一个真实的,13个字符的哈希,而不是失败。这不是你期望的那种哈希。

答案 1 :(得分:1)

正确的散列具有SHA-512 salt,因此其输出超过13个字符。不正确的哈希函数根本无法识别&#39; rounds = 10000 $ 6 $&#39;并将其输出为13个字符的标准加密字符串。