忘记 MD5 Sha1 吧 从现在开始使用 Bcrypt 和 Argon2i 吧
-
所以建议大家尽快抛弃 md5 和 sha1 这些不安全的算法
-
php在5.5版本以后已经为我们提供了非常安全的加密函数 bcrypt 了
- 使用函数 password_hash 生成基于Bcrypt算法的hash值
使用的具体如下
$password = filter_input(INPUT_POST, 'password'); $password = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); password_hash 的第二个选项就是选择使用的加密方法,默认选用的就是Bcrypt加密 第三个参数是工作因子cost,和 salt,不填就为默认
- 验证密码和hash值是否匹配可以使用 password_verify 函数
password_verify ($password, $hash) $password为明文密码,$hash为经过 password_hash函数哈希过后的值 相等会返回true,不相等会返回true
- password_needs_rehash 函数检测指定的hash值是否实现了提供的算法和选项。 如果没有,需要重新生成hash值
- 使用函数 password_hash 生成基于Bcrypt算法的hash值
-
下面有一个完整的登录的例子可以给大家演示一下
<?php
session_start();
try {
$email = filter_input(INPUT_POST, 'email');
$password = filter_input(INPUT_POST, 'password');
$user = User::findByEmail($email);
if (password_verify($password, $user->password) === false) {
throw new Exception('密码错误');
}
$currentHashAlgorithm = PASSWORD_DEFAULT;
$currentHashOptions = ['cost' => 15];
$passwordNeedRehash = password_needs_rehash(
$user->password,
$currentHashAlgorithm,
$currentHashOptions
);
if ($passwordNeedRehash === true) {
$password = password_hash(
$password,
$currentHashAlgorithm,
$currentHashOptions
);
$user->save();
}
$_SESSION['user_logged_in'] = 'yes';
$_SESSION['user_email'] = $email;
header('HTTP/1.1 302 Redirect');
header('Location:/index.php');
} catch (Exception $e) {
header('HTTP/1.1 401 Unauthorized');
echo $e->getMessage();
}
-
在 php7.2 提供了一个比 Bcrypt 更加安全的算法 Argon2i
- 使用的方法也很简单 把
password_hash
的第二个参数改成PASSWORD_ARGON2I
即可 - 当然它也有第三个选项 里面有三个参数
memory_cost (integer)
- 计算 Argon2 散列时的最大内存time_cost (integer)
- 计算 Argon2 散列时最多的时间threads (integer)
- 计算 Argon2 散列时最多的线程数
- 使用的方法也很简单 把
-
下面我们来比较一下
md5 sha1 bcrypt argon2i
算法bcrypt 和 argon2i 使用默认配置
<?php
$password=123456;
var_dump(md5($password));
var_dump(sha1($password));
var_dump($password = password_hash($password, PASSWORD_DEFAULT));
var_dump($password = password_hash($password, PASSWORD_ARGON2I));
结果
[root@JD ~]# php hash.php
string(32) "e10adc3949ba59abbe56e057f20f883e"
string(40) "7c4a8d09ca3762af61e59520943dc26494f8941b"
string(60) "$2y$10$5AnWGMjHEg3cDTsH5miUTuU7wY7OpERSIfMwxZzM.mWiNwj4oOps6"
string(95) "$argon2i$v=19$m=1024,t=2,p=2$d1JQR3Z2dDdtTFZURGU2RQ$xcac0lc1Olp75uA+Zv6ICIFFLAJpUKJ0rrZKRvribaA"
[root@JD ~]# php hash.php
string(32) "e10adc3949ba59abbe56e057f20f883e"
string(40) "7c4a8d09ca3762af61e59520943dc26494f8941b"
string(60) "$2y$10$zQlRfj.T/Qa9VkwiHBeN7.s1AUixlDtouLBkzX2jf9e3pYLgwPgGq"
string(95) "$argon2i$v=19$m=1024,t=2,p=2$WlNkU2d4dXhsSFJpbVhQYQ$t1jh8GuzRrCF+neeBfoXeZA6/Jxu2EudAg1WdbT3JJk"
显然易见 我们可以发现 bcrypt 和 argon2i 更加安全
如果有不相信的同学 可以到一些解密网站 如 cmd5 等去尝试解密 你会发现 md5 和 sha1 是真的非常容易被破解
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: