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警告Cannot use a scalar value as an array的解决方法
Jan 11 PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 PHP
php session_start()出错原因分析及解决方法
Oct 28 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
使用php实现从身份证中提取生日
May 09 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
PHP实现Unicode编码相互转换的方法示例
Nov 17 PHP
php实现等比例压缩图片
Jul 26 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 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制作静态网站的模板框架(三)
2006/10/09 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
Javascript验证方法大全
2015/09/21 Javascript
node.js require() 源码解读
2015/12/13 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
利用JS实现数字增长
2016/07/28 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
Python3.x中自定义比较函数
2015/04/24 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
python程序封装为win32服务的方法
2021/03/07 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
网络专业学生个人的自我评价
2013/12/16 职场文书
学习心得体会
2014/01/01 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
医院节能减排方案
2014/06/13 职场文书
教师师德师风整改措施
2014/10/24 职场文书
2014年防汛工作总结
2014/12/08 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
考研英语辞职信
2015/05/13 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis