【问题标题】:Function crypt() doesn't return the hash value in PHP 7.0函数 crypt() 在 PHP 7.0 中不返回哈希值
【发布时间】:2018-01-21 13:10:25
【问题描述】:

我有这样的事情(复制自http://www.gregboggs.com/php-blowfish-random-salted-passwords/

        $Blowfish_Pre = '$2a$05$';
        $Blowfish_End = '$';
        $bcrypt_salt = $Blowfish_Pre . $salt . $Blowfish_End;
        $hashed_password = crypt($password, $bcrypt_salt);

        echo $salt . '<br>';
        echo $password . '<br>';
        echo $bcrypt_salt . '<br>';
        echo $hashed_password . '<br>';
        echo "end";

当我测试运行它时,发现$hashed_password 的值与$bcrypt_salt 完全相同,而$salt$password$bcrypt_salt 的所有返回值都符合预期。我该如何解决这个问题?

【问题讨论】:

  • 你用的是什么版本的php?
  • 我使用的是 PHP 7.0

标签: php hash bcrypt crypt blowfish


【解决方案1】:

抱歉,打错了:“pre”中的“05$”太多了。尝试不使用。

手册 (http://php.net/manual/en/function.crypt.php) 说:

CRYPT_BLOWFISH - 使用盐散列的河豚如下:“$2a$”, “$2x$”或“$2y$”,两位数的成本参数,“$”和 22 个字符 来自字母“./0-9A-Za-z”。

使用这样一个 22 字符长的盐可以工作:

echo crypt('secret', '$2a$05$1234567890123456789012$');
$2a$05$123456789012345678901u.97m5mwuxOR3RvRKYm9sasohx5Mnzwq

始终使用随机哈希,以上只是一个示例!

如果您不需要“2a”版本的河豚,我建议使用以下内容,因为它与 crypt() 兼容并生成随机盐:

echo password_hash("secret", PASSWORD_BCRYPT);

P.S.:当阅读手册中的此类内容时,我倾向于建议不要再使用 PHP 做任何事情。他们不能像任何其他理智的 API 一样抛出异常吗?

在盐中使用超出此范围的字符将导致 crypt() 返回一个长度为零的字符串。

【讨论】:

  • “从 PHP 5.3.2 开始,Blowfish 对无效回合的行为返回“失败”字符串(“*0”或“*1”),而不是回退到 DES。”
猜你喜欢
  • 2015-11-14
  • 1970-01-01
  • 2014-07-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多