1

为此,我正在尝试测试 password_hash 方法,我创建了以下函数hashPassword

function hashPassword($string) {
    $settings = array('cost' => 10, 'encryption_key' => 'thisIsMyEncryptionKey1234');
    return password_hash($string, PASSWORD_BCRYPT, $settings);
}

现在,如果我用随机字符串测试它"test"

结果将是:

$2y$10$thisIsMyEncryptionKeyu5n3NNnKh3DjgJqgb5pE8YOLBclKrVWC

或者如果我用以下方式测试它helloworld

$2y$10$thisIsMyEncryptionKeyuVw8QRVNw8HbEWHX2oQlArVtne2TzOpS

谁能告诉我为什么会这样?或者它应该是这样的?

4

2 回答 2

6

除非您有充分的理由这样做,否则您永远不应手动提供加密密钥。我建议阅读password_hash更多的文档。

正确使用只会让系统自行解决所有问题:

function hashPassword($password)
{
    return password_hash($password, PASSWORD_DEFAULT);
}

然后 PHP 将在内部为当前硬件选择最佳可用算法和最合适的迭代次数,并生成安全且唯一的盐。

要验证密码,然后使用password_verify,并检查所需的重新哈希,例如在一个User类中:

class User
{
    ...

    public function verifyPassword($password)
    {
      if(!password_verify($password, $this->hash))
        return false;
      if(password_needs_rehash($this->hash, PASSWORD_DEFAULT))
        $this->setNewHashAndSaveToDB(password_hash($password, PASSWORD_DEFAULT));
      return true;
    }
}

通过使用这种结构,您可以确保散列密码始终保持最新并且随着硬件容量的进步而安全,在用户登录时自动进行。

关于选择什么算法PASSWORD_DEFAULT以及使用哪个配置的策略如下:

此函数对支持的算法的更新(或对默认算法的更改)必须遵循以下规则:

  • 在成为默认算法之前,任何新算法都必须成为 PHP 至少 1 个完整版本的核心。因此,例如,如果在 5.5.5 中添加了一个新算法,那么它直到 5.7 才符合默认条件(因为 5.6 将是第一个完整版本)。但是,如果在 5.6.0 中添加了不同的算法,它也可以在 5.7.0 中默认使用。
  • 默认值仅应在完整版本(5.6.0、6.0.0 等)上更改,而不应在修订版本上更改。唯一的例外是在当前默认值中发现严重安全漏洞的紧急情况下。
于 2014-01-04T14:44:55.300 回答
1

About加密密钥:

最佳加密密钥是从可靠的随机数发生器生成的二进制 blob 。建议使用以下示例(>= 5.3):

$keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CFB);
$encryptionKey = openssl_random_pseudo_bytes($key_size, $strong); //$strong will be true if the key is crypto safe

但是在您的情况下,您只需设置字符串,为此使用一些随机数据。

于 2014-01-04T14:48:39.537 回答