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函数的常用方法及注意之处小结
Jul 10 PHP
PHP语言中global和$GLOBALS[]的分析 之二
Feb 02 PHP
PHP系统命令函数使用分析
Jul 05 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
PHP扩展程序实现守护进程
Apr 16 PHP
php实现异步数据调用的方法
Dec 24 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
将PHP的session数据存储到数据库中的代码实例
Jun 24 PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
浅谈php调用python文件
Mar 29 PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 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
smtp邮件发送一例
2006/10/09 PHP
php下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
php db类库进行数据库操作
2009/03/19 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
Javascript缓存API
2016/06/14 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
[54:25]Ti4 循环赛第三日LGD vs MOUZ
2014/07/12 DOTA
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
Python抓取框架 Scrapy的架构
2016/08/12 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
PyCharm代码格式调整方法
2018/05/23 Python
Python连接Redis的基本配置方法
2018/09/13 Python
python爬虫之自制英汉字典
2019/06/24 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
关于python 跨域处理方式详解
2020/03/28 Python
秘书专业自荐信范文
2013/12/26 职场文书
文秘人员工作职责
2014/01/31 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
高中运动会广播稿
2015/08/19 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
js前端图片加载异常兜底方案
2022/06/21 Javascript
Go语言测试库testify使用学习
2022/07/23 Golang
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android