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 intval的测试代码发现问题
Jul 27 PHP
PHP字符串 ==比较运算符的副作用
Oct 21 PHP
PHP面向对象法则
Feb 23 PHP
探讨PHP中OO之静态关键字以及类常量的详解
Jun 07 PHP
PHP中使用asort进行中文排序失效的问题处理
Aug 18 PHP
PHP中变量引用与变量销毁机制分析
Nov 15 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
windows平台中配置nginx+php环境
Dec 06 PHP
php 截取中英文混合字符串的方法
May 31 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
php适配器模式简单应用示例
Oct 23 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 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中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
详解PHP中的PDO类
2015/07/06 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
Django实现跨域请求过程详解
2019/07/25 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2019/10/27 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
Python的logging模块基本用法
2020/12/24 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
自主实习接收函
2014/01/13 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
鲁迅故里导游词
2015/02/05 职场文书