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 相关文章推荐
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 PHP
PHP Socket 编程
Apr 09 PHP
20个PHP常用类库小结
Sep 11 PHP
PHP file_get_contents设置超时处理方法
Sep 30 PHP
php延迟静态绑定实例分析
Feb 08 PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
Mar 03 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
php自定义扩展名获取函数示例
Dec 12 PHP
PHP实现搜索时记住状态的方法示例
May 11 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
PHP实现简单注册登录系统
Dec 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
php的dl函数用法实例
2014/11/06 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
如何用python写个模板引擎
2021/01/14 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
求职自荐信的格式
2014/04/07 职场文书
学前班评语大全
2014/05/04 职场文书
护理专业求职信
2014/06/15 职场文书
2014个人年度工作总结
2014/12/15 职场文书
行政主管岗位职责
2015/02/03 职场文书
祝酒词范文
2015/08/12 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android