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 分页原理详解
Aug 21 PHP
php中截取中文字符串的代码小结
Jul 17 PHP
用php解析html的实现代码
Aug 08 PHP
PHP gbk环境下json_dencode传送来的汉字
Nov 13 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
Apr 26 PHP
PHP判断远程图片是否存在的几种方法
May 04 PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 PHP
PHP调用C#开发的dll类库方法
Jul 28 PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 PHP
smarty模板引擎之分配数据类型
Mar 30 PHP
php文件缓存类用法实例分析
Apr 22 PHP
PHP判断手机是IOS还是Android
Dec 09 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 中检查或过滤IP地址的实现代码
2011/11/27 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
JavaScript学习历程和心得小结
2010/08/16 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
关于express与koa的使用对比详解
2018/01/25 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
Python pandas用法最全整理
2019/08/04 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
小学教育见习报告
2014/10/31 职场文书
专业见习报告范文
2014/11/03 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
文明礼仪倡议书
2015/04/28 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
创业计划书之甜品店
2019/09/18 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL