当前位置: 首页> 最新文章列表> PHP 项目中应该用 crypt() 还是 password_hash()?

PHP 项目中应该用 crypt() 还是 password_hash()?

M66 2025-05-23

在 PHP 项目中,密码加密是确保用户数据安全的重要环节。常见的两种密码加密方式是 crypt() 函数和 password_hash() 函数。那么,究竟应该选择哪一个?它们之间有什么区别?本文将详细分析这两者的特点,帮助你做出更合适的选择。

1. crypt() 简介

crypt() 是 PHP 中一个比较底层的密码加密函数,它基于系统的加密算法实现。该函数的使用比较灵活,支持多种加密算法(如 DES、MD5、Blowfish、SHA-256、SHA-512 等),但使用起来相对复杂,需要开发者手动指定加密算法和盐值(salt)。

$password = 'mysecretpassword';
$salt = '$2y$10$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hashed = crypt($password, $salt);
echo $hashed;

这里,$2y$ 代表 Blowfish 算法,10 是成本参数(cost),盐值需要手动生成。

优点:

  • 支持多种加密算法。

  • 灵活性较高,适合有特定需求的项目。

缺点:

  • 需要开发者自己处理盐值,容易出错。

  • 代码复杂,容易导致安全漏洞。

  • 不具备自动升级算法的能力。

2. password_hash() 简介

password_hash() 是 PHP 5.5+ 引入的密码哈希函数,专门用于密码加密。它内置了安全的算法和自动生成盐值,使用简单且安全。

$password = 'mysecretpassword';
$hashed = password_hash($password, PASSWORD_DEFAULT);
echo $hashed;

PASSWORD_DEFAULT 会自动使用当前最安全的算法(通常是 bcrypt),且会自动生成盐值,免去开发者繁琐的操作。

优点:

  • 自动生成安全盐值。

  • 简洁易用,代码清晰。

  • 支持密码验证函数 password_verify()

  • 支持哈希算法升级,方便后续安全维护。

缺点:

  • 灵活性稍弱,不支持自定义盐值。

  • 依赖 PHP 版本,低版本需手动引入兼容库。

3. 两者的核心区别

特性crypt()password_hash()
盐值处理需手动生成盐值自动生成安全盐值
算法支持多种算法(需手动指定)默认使用安全算法(如 bcrypt)
易用性复杂,需要细心设计简单,推荐使用
密码验证需手动处理使用 password_verify() 简化
兼容性兼容所有 PHP 版本需要 PHP 5.5 及以上
安全性易因使用不当导致安全问题设计上更安全且易维护

4. 实际推荐

在现代 PHP 项目中,推荐使用 password_hash() 进行密码加密。它不仅降低了开发难度,还能保证更高的安全性和可维护性。crypt() 虽然功能强大,但使用复杂且容易出现配置错误,只有在特定场景下(如需要兼容非常老的系统)才建议使用。

示例:密码验证

使用 password_hash() 创建哈希后,验证密码非常方便:

$hashed = password_hash('mysecretpassword', PASSWORD_DEFAULT);

if (password_verify('mysecretpassword', $hashed)) {
    echo '密码验证成功';
} else {
    echo '密码错误';
}

5. 总结

  • 选择 password_hash() 简单、安全、现代的密码加密方法,适合绝大多数应用场景。

  • 选择 crypt() 当有特殊需求或对加密算法有自定义要求时可考虑,但使用门槛较高且风险较大。

为了保障用户信息安全,强烈建议 PHP 开发者优先考虑 password_hash(),并结合 password_verify() 进行密码验证,确保代码既简洁又安全。