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面向对象全攻略 (八)重载新的方法
Sep 30 PHP
支持中文字母数字、自定义字体php验证码代码
Feb 27 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
PHP+Ajax 检测网络是否正常实例详解
Dec 16 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
php实现表单提交上传文件功能
May 28 PHP
PHP删除数组中特定元素的两种方法
Feb 28 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
node获取客户端ip功能简单示例
2019/08/24 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
python next()和iter()函数原理解析
2020/02/07 Python
详解Python 函数参数的拆解
2020/09/02 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
法国房车租赁网站:Yescapa
2019/08/26 全球购物
宿舍打麻将检讨书
2014/01/24 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
白鹤梁导游词
2015/02/06 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL