如何在PHP中安全地存储密码?

在PHP中安全地存储密码是保护用户信息不受未授权访问的重要步骤。以下是一系列推荐的步骤,可以帮助你以安全的方式存储密码:

1. 使用强哈希算法

哈希密码

  • 不要使用MD5或SHA1:这些算法已被证实存在安全隐患。
  • 使用Bcrypt、Argon2或PBKDF2:这些算法被设计用来保护密码,因为它们包含密钥拉伸功能,可以抵抗暴力破解攻击。

在PHP中,可以使用password_hash()password_verify()函数来处理密码的哈希和验证。这些函数是自PHP 5.5起引入的,支持Bcrypt算法,从PHP 7.2开始,还支持Argon2算法。

示例代码:

// 创建密码哈希
$password = "userPassword123";
$hash = password_hash($password, PASSWORD_DEFAULT);  // 使用默认算法(Bcrypt)

// 存储这个$hash值到数据库

// 验证用户输入的密码
$userInput = "userPassword123";
if (password_verify($userInput, $hash)) {
    echo "Password is valid!";
} else {
    echo "Invalid password!";
}

2. 使用盐增强安全性

现代密码哈希API(如password_hash)会自动为每个密码生成一个安全的“盐”(salt)。盐是一个随机值,与密码组合在一起进行哈希处理,可以防止使用彩虹表进行攻击。

3. 选择合适的成本因子

  • Bcrypt:可以通过password_hash()的选项设置成本因子,例如:
    $options = ['cost' => 12];
    $hash = password_hash($password, PASSWORD_BCRYPT, $options);
    
  • Argon2:可以设置内存消耗、时间消耗和并行度:
    $options = ['memory_cost' => 1<<17, 'time_cost' => 4, 'threads' => 2];
    $hash = password_hash($password, PASSWORD_ARGON2I, $options);
    

4. 定期更新哈希算法

随着计算技术的发展,密码哈希算法可能会变得不够安全。定期审查并升级到更强大的算法是必要的。例如,从Bcrypt迁移到Argon2。

5. 安全存储哈希

  • 不要在日志文件中记录明文密码或哈希
  • 确保数据库安全:使用强密码、正确配置的网络安全策略和数据库加密。

6. 提供多因素认证

尽管并非直接关系到密码存储,启用多因素认证(MFA)可以大幅增加账户的安全性。

通过以上步骤,你可以大幅提高在PHP中存储密码的安全性,从而更好地保护用户数据免受攻击。