PHP的password_hash()使用实例


Posted in PHP onMarch 17, 2014

一、前言
PHP5.5提供了许多新特性及Api函数,其中之一就是Password Hashing API(创建和校验哈希密码)。
它包含4个函数:password_get_info()、password_hash()、password_needs_rehash()、password_verify()。
在PHP5.5之前,我们对于密码的加密可能更多的是采用md5或sha1之类的加密方式(没人像CSDN那样存明文吧。。),如:
echo md5("123456"); //输出: e10adc3949ba59abbe56e057f20f883e
但是简单的md5加密很容易通过字典的方式进行破解,随便找个md5解密的网站就能获取原始密码。
二、Password Hashing API
php5.5提供的Password Hashing API就能很好的解决这些问题。
我们先来看password_hash()函数:

string password_hash ( string $password , integer $algo [, array $options ])

它有三个参数:密码、哈希算法、选项。前两项为必须的。
让我们使用password_hash()简单的创建一个哈希密码:
$pwd = "123456";
$hash = password_hash($pwd, PASSWORD_DEFAULT);
echo $hash;

上例输出结果类似:$2y$10$4kAu4FNGuolmRmSSHgKEMe3DbG5pm3diikFkiAKNh.Sf1tPbB4uo2
并且刷新页面该哈希值也会不断的变化。
哈希值创建完毕,我们可以用password_verify()来校验密码是否和哈希值匹配:
boolean password_verify ( string $password , string $hash )

它接收2个参数:密码和哈希值,并返回布尔值。检查之前生成的哈希值是否和密码匹配:

if (password_verify($pwd,'$2y$10$4kAu4FNGuolmRmSSHgKEMe3DbG5pm3diikFkiAKNh.Sf1tPbB4uo2')) {  
    echo "密码正确";
} else {  
    echo "密码错误";
}

基本上使用以上这2个函数就能安全的创建和校验hash密码了,还有另外2个API函数:

password_get_info()              //查看哈希值的相关信息
password_needs_rehash()     //检查一个hash值是否是使用特定算法及选项创建的

三、点评
虽然通过password_hash()创建的哈希密码更加安全,但是却降低了互操作性。
如我们使用md5方式,在php中用标准的MD5加密,很容易通过其他语言来校验,如node.js:
var hash = crypto.createHash('md5').update("123456").digest('hex');
if(hash == "e10adc3949ba59abbe56e057f20f883e")  console.log('密码正确');

而使用password_hash()加密的哈希值基本只能通过PHP的password_verify来校验。
这2种方法各有优劣,是使用md5(或sha1等)+salt(干扰字符串)的方式还是使用password_hash()大家根据具体情况取舍把。
PHP 相关文章推荐
PHP 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
php使用curl和正则表达式抓取网页数据示例
Apr 13 PHP
php针对cookie操作的队列操作类实例
Dec 10 PHP
discuz目录文件资料汇总
Dec 30 PHP
PHP实现通过正则表达式替换回调的内容标签
Jun 15 PHP
ThinkPHP控制器详解
Jul 27 PHP
深入剖析浏览器退出之后php还会继续执行么
May 17 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
PHP5各个版本的新功能和新特性总结
Mar 16 #PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 #PHP
19个超实用的PHP代码片段
Mar 14 #PHP
php的zip解压缩类pclzip使用示例
Mar 14 #PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 #PHP
zf框架db类的分页示例分享
Mar 14 #PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 #PHP
You might like
php GD绘制24小时柱状图
2008/06/28 PHP
PHPMyAdmin 快速配置方法
2009/05/11 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
js实现轮播图特效
2020/05/28 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
浅谈python数据类型及类型转换
2017/12/18 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
python实现Flappy Bird源码
2018/12/24 Python
Python的互斥锁与信号量详解
2019/09/12 Python
python 字符串常用方法汇总详解
2019/09/16 Python
深入浅析python的第三方库pandas
2020/02/13 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
自我推荐书
2013/12/04 职场文书
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis