5

这是我第一次在 PHP 中使用 crypt() 函数,我不知道为什么它不起作用。我的代码基于这篇文章:http ://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274

function blowfishHash ($pw) {
   //generate random salt
   $salt = "$2y$10$";
   for ($i = 0; $i < 22; $i++) {
       $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
   }
  $hash = crypt($pw, $salt);

  //printout to file
  $file = fopen("debug.txt", "w+");
  fwrite($file, "\n\n\n".$pw);
  fwrite($file, "\n\n\n".$salt);
  fwrite($file, "\n\n\n".$hash);
  fclose($file);

  return $hash;
}

我用示例密码“password”调用了该函数。

结果盐是:$2y$10$NzRQNjTRfP4jXKvb4TCO.G
但密码是"$2mV0NZp92R3g"——这似乎太短了。

有人可以帮我弄清楚我做错了什么吗?

4

4 回答 4

2

正如您在评论中所说,您使用的是 PHP 5.2.x。

Blowfish 实现仅在 PHP >= 5.3.x 中可用。如果由于任何原因无法安装较新的 PHP 版本,您可以在此处查看有关如何使 Blowfish 与较旧的 PHP 版本一起工作的更多信息。

于 2013-01-24T17:33:50.543 回答
1

由于crypt在 PHP 5.2 中不支持 CRYPT_BLOWFISH,因此默认将 salt 解释为 CRYPT_DES 样式的 salt。请注意,输出以“$2”开头,这是 CRYPT_DES 从 salt 输入中选择并添加到散列之前的两个字符 salt,并且输出长度与 CRYPT_DES 输出长度精确匹配。

有趣的是,您可以通过简单地将盐截断为两个字符,在支持 CRYPT_BLOWFISH 的更高版本的 PHP 中实现相同的结果。IE:

crypt('password', '$2y$10$NzRQNjTRfP4jXKvb4TCO.G')   /* in PHP 5.2 */ 
 ==
crypt('password', '$2')   /* in PHP 5.4 */

从理论上讲,如果在 PHP 5.2 上错误地使用了 CRYPT_BLOWFISH 样式的盐,这对于向后兼容可能会派上用场。

这实际上让我最近有点困惑,因为根据PHP crypt 文档,“$”字符不是 CRYPT_DES 的有效盐输入,其中说:

基于 DES 的标准哈希,带有来自字母表“./0-9A-Za-z”的两个字符盐。在 salt 中使用无效字符会导致 crypt() 失败。

crypt()但是这里的“$”字符显然在 v5.2 和 v5.4 中都被接受了。

crypt如果像文档所说的那样实际返回失败,而不是接受“$”并默认为 CRYPT_DES,这将更加清晰和安全。

于 2013-03-18T19:40:13.187 回答
1

这是我的河豚加密功能....

<?php
    function bcrypt($input, $salt=null, $rounds=12) {
        if($rounds < 4 || $rounds > 31) $rounds = 12;
        if(is_null($salt)) $salt = sprintf('$2a$%02d$', $rounds).substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);
        return crypt($input, $salt);
    }
    $hash = bcrypt('password');
    if($hash = bcrypt('password', $hash)) {
        // password ok
    }

?>
于 2013-08-15T22:43:32.157 回答
0

最初只支持以 开头的盐的河豚散列$2a$

$2x$PHP 5.3.7中$2y$添加了 Blowfish 模式以应对潜在的高位攻击。

您的 PHP 5.2.17 不支持$2y$Blowfish 模式。

这就是为什么您的代码不起作用的原因。

于 2017-07-01T19:33:07.833 回答