创建密码哈希password_hash()用于使用当前行业最佳实践标准哈希或密钥派生。在撰写本文时,该标准为bcrypt,这意味着它PASSWORD_DEFAULT包含与相同的值PASSWORD_BCRYPT。
$options = [ 'cost' => 12, ]; $hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options);
第三个参数不是必需的。
该'cost'值应根据生产服务器的硬件来选择。增大密码将使密码生成成本更高。它生成的成本越高,尝试破解它的人生成它所花费的时间就越长。理想情况下,成本应尽可能高,但是在实践中应将其设置为不会降低所有功能的速度。在0.1到0.4秒之间的某个地方可以。如有疑问,请使用默认值。
在低于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算法,纯文本盐和生成的哈希一起存储,这意味着哈希可以在不同的系统和平台之间传输,并且仍然与原始密码匹配。
即使不建议这样做,也可以使用该salt选项定义自己的随机盐。
$options = [ 'salt' => $salt, //见下面的例子 ];
重要的。如果您忽略此选项,将为password_hash()每个散列的密码生成随机盐。这是预期的操作模式。
从PHP 7.0.0开始不推荐使用salt选项。现在,最好仅使用默认情况下生成的盐。