【问题标题】:PHP crypt() returning 13, and not less than 13 characters, on failurePHP crypt() 失败时返回 13 个且不少于 13 个字符
【发布时间】:2014-08-21 20:07:55
【问题描述】:

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

(正确的哈希已被缩写)

【问题讨论】:

  • 我想知道为什么这是相关的,你打算使用错误哈希吗?
  • 这与我有关,因为 1. 我喜欢了解函数的完整行为以获取整体观点。 2. 如果你使用

标签: php return-value crypt


【解决方案1】:

您的“不正确”哈希被识别为标准的两字符 DES 哈希;后面的字符被忽略。 crypt() 基本上是根据您的 salt 计算出要使用的算法,但不是看到不正确的 SHA512 salt,而是看到正确的 DES salt,因为前两个字符是有效的 DES salt。

manual 中有关于正在发生的事情的重要线索:

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

请注意,您的“不正确”输出以与盐相同的两个字符开头——在这种情况下,它们实际上是整个盐。

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

【讨论】:

  • 啊!这就是发生的事情..然后一切都井井有条!谢谢!
【解决方案2】:

正确的哈希具有 SHA-512 盐,因此其输出长度超过 13 个字符。不正确的哈希函数根本无法识别 'rounds=10000$6$' 的盐​​,并将其输出为 13 个字符的标准 crypt 字符串。

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 2015-08-09
    • 2015-03-21
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    相关资源
    最近更新 更多