【问题标题】:PHP bcrypt hash store the saltPHP bcrypt 哈希存储盐
【发布时间】:2012-08-01 00:48:59
【问题描述】:

我从互联网上为 bcrypt 获取了以下功能。它输出一个加密的密码,这正是我正在寻找的。我还使用了一个函数来使用盐进行检查,但是这个函数没有为我提供盐。

function bcrypt_hash($password, $work_factor = 8)
{
    if (version_compare(PHP_VERSION, '5.3') < 0) throw new Exception('Bcrypt requires PHP 5.3 or above');

    if (! function_exists('openssl_random_pseudo_bytes')) {
        throw new Exception('Bcrypt requires openssl PHP extension');
    }

    if ($work_factor < 4 || $work_factor > 31) $work_factor = 8;
    $salt = 
        '$2a$' . str_pad($work_factor, 2, '0', STR_PAD_LEFT) . '$' .
        substr(
            strtr(base64_encode(openssl_random_pseudo_bytes(16)), '+', '.'), 
            0, 22
        )
    ;
    return crypt($password, $salt);
}

我需要分别返回密码和盐。或者有没有办法将它们分别从这个函数中拉出来。

【问题讨论】:

  • 为什么需要将它们分开?您仍然可以将它们连接在一起存储在一个字符串中。在这种情况下,第一个或最后一个 X 字符总是盐。不需要多个数据库字段或函数返回值。
  • @feeela 有趣的告诉我更多。如果这就是密码字段所需要的全部内容,那么我们如何在用户登录时检查它。
  • 我在snipplr上贴过这样的功能;我想你会明白的:snipplr.com/view/66454/passwordhash--generate-salted-passwords

标签: php function bcrypt


【解决方案1】:

你不能从一个函数返回多个值,但你可以返回一个包含多个值的数据结构:

return array('crypt' => crypt($password, $salt), 'salt' => $salt);

【讨论】: