在 PHP 中,crypt() 函数是一个常用的加密函数,主要用于对字符串进行单向加密处理,特别是在处理密码存储时非常实用。本文将详细解析 crypt() 函数的参数,并通过实例演示如何用 PHP 的 crypt() 函数安全地加密字符串。
crypt() 是 PHP 内置的一个加密函数,基于 Unix 的 crypt() 函数实现。它使用不同的加密算法(如 DES、MD5、Blowfish、SHA-256、SHA-512 等)对输入字符串进行加密,返回加密后的字符串。
函数原型:
string crypt ( string $str [, string $salt ] )
$str:需要加密的字符串,通常是密码。
$salt(可选):用于指定加密算法及加盐的字符串。不同的盐决定了加密算法和结果。
这是待加密的明文字符串,通常是用户的密码。
盐参数是决定加密算法和结果的关键。不同格式的盐代表不同的算法:
默认 DES 加密
长度为 2 个字符的盐,例如:"ab"
这是最原始的加密方式,安全性较弱,不推荐使用。
MD5 加密
以 $1$ 开头,后接最多 8 个字符的盐,例如:"$1$m66net12$"
这会使用 MD5 算法加密。
Blowfish 加密
以 $2a$、$2y$、$2b$ 等开头,后面是 2 位数字表示成本因子,和 22 位的盐,例如:"$2y$10$m66netsaltsaltsaltsa$"
Blowfish 是较为安全的算法。
SHA-256 加密
以 $5$ 开头,后接盐,例如:"$5$m66net$"
SHA-512 加密
以 $6$ 开头,后接盐,例如:"$6$m66net$"
// MD5 盐示例
$salt_md5 = '$1$m66net12$';
// Blowfish 盐示例,10 是成本因子(cost factor)
$salt_blowfish = '$2y$10$m66netsaltsaltsaltsa$';
// SHA-256 盐示例
$salt_sha256 = '$5$m66net$';
// SHA-512 盐示例
$salt_sha512 = '$6$m66net$';
下面通过几个实例来展示如何使用 crypt() 函数加密字符串。
$password = "mypassword";
$salt = "m6"; // 2字符盐
$hashed = crypt($password, $salt);
echo "DES加密结果:" . $hashed;
$password = "mypassword";
$salt = '$1$m66net12$'; // 以 $1$ 开头的盐
$hashed = crypt($password, $salt);
echo "MD5加密结果:" . $hashed;
$password = "mypassword";
$salt = '$2y$10$m66netsaltsaltsaltsa$'; // Blowfish,成本10
$hashed = crypt($password, $salt);
echo "Blowfish加密结果:" . $hashed;
$password = "mypassword";
$salt = '$6$m66net$';
$hashed = crypt($password, $salt);
echo "SHA-512加密结果:" . $hashed;
加密密码后,验证时要用相同的盐重新加密输入的密码,然后对比结果是否相同。
// 假设数据库中保存的密码哈希
$stored_hash = '$6$m66net$........'; // 从数据库取出的加密结果
// 用户登录时输入的密码
$input_password = "mypassword";
// 取出盐,通常是 stored_hash 的前几个部分,具体长度视算法而定
$salt = substr($stored_hash, 0, strrpos($stored_hash, '$') + 1);
// 用相同盐重新加密输入密码
$input_hash = crypt($input_password, $salt);
if ($input_hash === $stored_hash) {
echo "密码验证成功";
} else {
echo "密码验证失败";
}
crypt() 函数支持多种加密算法,通过盐参数决定。
推荐使用 Blowfish ($2y$) 或 SHA-512 ($6$) 算法,安全性更高。
盐必须随机且唯一,且格式必须正确。
密码验证时,使用加密后的哈希值中的盐再次加密输入密码,然后比较。