PHP 创建密码哈希

示例

创建密码哈希password_hash()用于使用当前行业最佳实践标准哈希或密钥派生。在撰写本文时,该标准为bcrypt,这意味着它PASSWORD_DEFAULT包含与相同的值PASSWORD_BCRYPT。

$options = [
    'cost' => 12,
];

$hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options);

第三个参数不是必需的

该'cost'值应根据生产服务器的硬件来选择。增大密码将使密码生成成本更高。它生成的成本越高,尝试破解它的人生成它所花费的时间就越长。理想情况下,成本应尽可能高,但是在实践中应将其设置为不会降低所有功能的速度。在0.1到0.4秒之间的某个地方可以。如有疑问,请使用默认值。

5.5

在低于5.5.0的PHP上,该password_*功能不可用。您应该使用兼容性包来替代那些功能。请注意,该兼容包需要PHP 5.3.7或更高版本或已向后$2y移植该修订的版本(例如RedHat提供)。

如果您不能使用它们,则可以使用crypt()Aspassword_hash()作为crypt()功能的包装器实现密码散列,而不必失去任何功能。

// 这是bcrypt哈希的简单实现,否则兼容
// 用`password_hash()`
// 不保证与完整的`password_hash()`保持相同的加密强度。
// 实作

// 如果`CRYPT_BLOWFISH`为1,则表示bcrypt(使用河豚鱼)可用
// 在您的系统上
if (CRYPT_BLOWFISH == 1) {
    $salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
    $salt = base64_encode($salt);
    // crypt使用修改后的base64变体
    $source = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    $dest = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt = strtr(rtrim($salt, '='), $source, $dest);
    $salt = substr($salt, 0, 22);
    // crypt()通过盐字符串的形式确定使用哪种哈希算法
    // 传入
    $hashedPassword = crypt($plaintextPassword, '$2y$10$'.$salt.'$');
}

盐用于密码哈希

尽管crypt算法具有可靠性,但仍然存在针对彩虹表的漏洞。这就是为什么建议使用盐的原因

盐是在哈希之前附加到密码上的东西,以使源字符串唯一。给定两个相同的密码,生成的哈希值也将是唯一的,因为它们的盐是唯一的。

随机盐是密码安全性中最重要的部分之一。这意味着,即使使用已知密码哈希表查找表,攻击者也无法将用户的密码哈希与数据库密码哈希表进行匹配,因为使用了随机盐。您应始终使用随机且加密安全的盐。阅读更多

通过password_hash() bcrypt算法,纯文本盐和生成的哈希一起存储,这意味着哈希可以在不同的系统和平台之间传输,并且仍然与原始密码匹配。

7.0

即使不建议这样做,也可以使用该salt选项定义自己的随机盐。

 $options = [
        'salt' => $salt, //见下面的例子
 ];

重要的。如果您忽略此选项,将为password_hash()每个散列的密码生成随机盐。这是预期的操作模式。

7.0

从PHP 7.0.0开始不推荐使用salt选项。现在,最好仅使用默认情况下生成的盐。