几种 PHP 加密操作
md5
传统做法,两次 md5,同时给出 salt,然后保存 $encryped 和 $salt 到数据库。这三个值是固定的:$encryped, $password, $salt。
$encryped = md5(md5($password) . $salt);
// 下次再加密一次,判断是否相等:
if ($encryped == md5(md5($user_input) . $salt)) {
echo "Password verified!";
}
crypt / hash_equals
crypt() 函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。 在不同的操作系统上,该函数的行为不同,某些操作系统支持一种以上的算法类型。在安装时,PHP 会检查什么算法可用以及使用什么算法。 确切的算法依赖于 salt 参数的格式和长度。salt 可以通过增加由一个特定字符串与一个特定的加密方法生成的字符串的数量来使得加密更安全。 这里有一些和 crypt() 函数一起使用的常量。这些常量值是在安装时由 PHP 设置的。CRYPT_SALT_LENGTH、 CRYPT_STD_DES、 CRYPT_EXT_DES、 CRYPT_MD5、 CRYPT_BLOWFISH、 CRYPT_SHA_256、 CRYPT_SHA_512
$hashed_password = crypt($password); // 自动生成盐值
/* 你应当使用 crypt() 得到的完整结果作为盐值进行密码校验,以此来避免使用不同散列算法导致的问题。(如上所述,基于标准 DES 算法的密码散列使用 2 字符盐值,但是基于 MD5 算法的散列使用 12 个字符盐值。)*/
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo "Password verified!";
}
Hash::make / Hash::check
Laravel 自带 Hash::make 加密规则默认为 AES-256-CBC,每次也是返回不同的值
// use Illuminate\Support\Facades\Hash;
$hashedPassword = Hash::make($password);
if(Hash::check($user_input, $hashedPassword)) {
echo "Password verified!";
}
// 或者
$user = array('email' => $email, 'password' => $password);
if (Auth::attempt($user)){
echo "Password verified!";
}
password_hash / password_verify
使用足够强度的单向散列算法创建密码的散列(hash)。 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()。 当前支持的算法:PASSWORD_DEFAULT、PASSWORD_BCRYPT、PASSWORD_ARGON2I
// 每次生成的 password 是随机的,保存 $hashed_password 到数据库,下次用 password_verify 校验
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($user_input, $hashed_password)) {
echo "Password verified!";
}