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 相关文章推荐
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
PHP编码规范的深入探讨
Jun 06 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
Jul 05 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 PHP
深入解析PHP中foreach语句控制数组循环的用法
Nov 30 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
微信公众号之主动给用户发送消息功能
Jun 22 PHP
php实现微信和支付宝支付的示例代码
Aug 11 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
html中select语句读取mysql表中内容
2006/10/09 PHP
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
python3图片转换二进制存入mysql
2013/12/06 Python
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python flask框架post接口调用示例
2019/07/03 Python
使用python模拟高斯分布例子
2019/12/09 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
中学生打架检讨书
2014/10/13 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
初三毕业感言
2015/07/31 职场文书
了解Redis常见应用场景
2021/06/23 Redis