在php5.5中,加入了一个新的密码哈希函数,可使用Bcrypt轻松实现加盐的安全密码。
bcrypt和其他对称或非对称加密方式不同的是,不是直接解密得到明文,也不是二次加密比较密文,而是把明文和存储的密文一块运算得到另一个密文,如果这两个密文相同则验证成功。
官方手册在这里: http://cn2.php.net/manual/zh/book.password.php
生成密钥
$hash = password_hash('password',PASSWORD_BCRYPT,['cost' => 10]);
echo $hash;
password_hash() —-加密密码
第一个参数:需要加密的密码
第二个参数:密码算法常量 (http://cn2.php.net/manual/zh/password.constants.php)
第三个参数:数组类型。支持两个选项:salt在散列密码时加的盐(干扰字符串)。cost用来指明算法递归的层数。
上面代码每次运行生成的密钥不同,大致效果如下。
$2y$10$bWNfw6QbjmjyCDBc9lrZRuBjraxBzN7eAuozS6D3r4QxJn0tgXRwe
生成的密钥长度为60位,所以设计数据库的时候需要注意。
验证密钥
懒得存数据库再去取了,直接把刚生成的密钥复制过来了~~
$hash = '$2y$10$bWNfw6QbjmjyCDBc9lrZRuBjraxBzN7eAuozS6D3r4QxJn0tgXRwe';
$res = password_verify('password',$hash);
var_dump($res);
如果没有天灾人祸意外发生的话。你会看到下面的输出
bool(true)
这就成功了。
性能
下面我们来看看Bcrypt的性能,安全性的提升,肯定是以性能为代价。bcrypt要加强密码安全性,增加运行时间也是肯定的。那我们现在就测试一下Bcrypt与普通md5的速度。
测试机性能:
CPU I7 4核 2.3G主频
内存 16G ddr3 内存
系统 Mac
PHP 5.5.15
现在用下面这段代码分别测试一下md5和Bcrypt在不加盐的情况下的运行速度
`<?php
` $s_time = microtime(true);
` password_hash('password',PASSWORD_BCRYPT,['cost' => 10]);
` // md5('password');
` $e_time = microtime(true);
` $run_time = $e_time-$s_time;
` echo ($run_time*1000).'ms';
Bcrypt 5次运行结果
68.569183349609ms
68.006992340088ms
69.074869155884ms
68.211078643799ms
68.757057189941ms
md5 5次运行结果
0.0040531158447266ms
0.0040531158447266ms
0.0050067901611328ms
0.0040531158447266ms
0.003814697265625ms
测试结果
Bcrypt 加密一个密文平均值在68
毫秒左右,
md5 加密一个密文平均值在0.004
毫秒左右,
性能大约差距16000倍
采用md5 一秒大约能加密 250000
个密文
采用Bcrypt 一秒大约能加密 14
个密文
所以,如果你要将Bcrypt用到你的程序中去的话。小应用还好,如果是大应用。您就得按倍数增加服务器了。
如果不是给五角大楼写程序,其实md5+salt安全性已经足够了。