<?php
// 假设我们在数据库中存储盐
$salt = 'random_salt_1234';
// 用户输入的密码
$password = 'user_password';
// 使用 MD5 对密码加盐进行哈希
$hashedPassword = md5($salt . $password);
// 输出哈希值
echo "加盐后的MD5哈希: " . $hashedPassword;
这段代码的缺点:
3. 为什么选择 Bcrypt?
Bcrypt 是为了密码存储而设计的哈希算法,具有以下优势:
抗暴力破解:Bcrypt 的计算速度比 MD5 慢得多,使得暴力破解变得更加困难。Bcrypt 通过增加计算的复杂度(通过工作因子 cost
)来增加破解的难度,且工作因子可以随时间增加。
内置盐:Bcrypt 内部自动生成盐,避免了盐管理的问题。每次加密时都生成唯一的盐值,确保相同的密码生成不同的哈希值。
可调节计算强度:Bcrypt 的工作因子(cost
)可以根据硬件性能的提升进行调节,提高加密计算的难度,从而保证未来的安全性。
设计时考虑密码安全:Bcrypt 是为密码存储而设计,能够有效抵御现代攻击技术,如 GPU 攻击。
4. Bcrypt加密的示例(安全的实现)
4.1 使用 PHP 内置函数 password_hash()
加密密码
PHP 提供了 password_hash()
和 password_verify()
函数来简化密码加密和验证,并默认使用 Bcrypt。
<?php
// 用户输入的密码
$password = 'user_password';
// 使用 Bcrypt 加密密码(密码哈希化)
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
// 输出加密后的哈希值
echo "Bcrypt 加密后的密码哈希: " . $hashedPassword;
4.2 验证密码
通过 password_verify()
可以验证用户输入的密码是否与存储的哈希匹配。
<?php
// 用户输入的密码
$passwordInput = 'user_password';
// 存储在数据库中的 Bcrypt 哈希值
$storedHash = '$2y$10$W9.tLl9OG5jRp2NRse8O1.j8e7z9Rr5TefpGhS2/dZnHfjZnx2.LK'; // 示例哈希
// 验证输入密码是否与哈希匹配
if (password_verify($passwordInput, $storedHash)) {
echo "密码验证成功!";
} else {
echo "密码验证失败!";
}
4.3 控制 Bcrypt 的计算成本
Bcrypt 支持设置 工作因子(cost),它决定了计算的复杂度(即哈希计算的时间消耗)。工作因子越大,哈希计算的速度就越慢,暴力破解的难度也越大。
<?php
$password = 'user_password';
// 设置成本因子(工作因子),可以调整计算的复杂度,10 为常见的默认值
$options = [
'cost' => 12, // 默认 10,增加成本会让计算变慢,提高安全性
];
// 使用 Bcrypt 加密密码,指定成本因子
$hashedPassword = password_hash($password, PASSWORD_BCRYPT, $options);
echo "加密后的密码哈希:".$hashedPassword;