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和ACCESS写聊天室(一)
Oct 09 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
Aug 06 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
PHP eval函数使用介绍
Dec 08 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
Dec 15 PHP
php计算2个日期的差值函数分享
Feb 02 PHP
php实现模拟登陆方正教务系统抓取课表
May 19 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
实现php删除链表中重复的结点
Sep 27 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 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
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
Python实现自动上京东抢手机
2018/02/06 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
python计算列表内各元素的个数实例
2018/06/29 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
Python PO设计模式的具体使用
2019/08/16 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
全球最大的游戏市场:G2A
2018/07/05 全球购物
2014年大班元旦活动方案
2014/02/26 职场文书
师德师风演讲稿
2014/05/05 职场文书
银行求职信范文
2014/05/26 职场文书
2014年防汛工作总结
2014/12/08 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js