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 expects parameter 1 to be resource, array given 错误
Mar 23 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
Apr 18 PHP
PHP垃圾回收机制引用计数器概念分析
Jun 24 PHP
PHP中echo和print的区别
Aug 28 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
PHP 实现判断用户是否手机访问
Jan 21 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
详解Yii2高级版引入bootstrap.js的一个办法
Mar 21 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
PHP _construct()函数讲解
Feb 03 PHP
浅谈PHP无限极分类原理
Mar 14 PHP
Laravel框架处理用户的请求操作详解
Dec 20 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
多数据表共用一个页的新闻发布
2006/10/09 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
php中final关键字用法分析
2016/12/07 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
js压缩利器
2007/02/20 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
python如何通过protobuf实现rpc
2016/03/06 Python
什么是Python中的顺序表
2020/06/02 Python
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
致百米运动员广播稿
2014/01/29 职场文书
企业总经理职责
2014/02/02 职场文书
学校评语大全
2014/05/06 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
单位计划生育责任书
2015/05/09 职场文书
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB