PHP中创建和验证哈希的简单方法实探


Posted in PHP onJuly 06, 2015

 PHP 5.5.0 带来了一份完整的全新特性与函数的列表。全新API之一就是Password Hashing API.它包含4个函数:password_get_info(), password_hash(), password_needs_rehash(),和password_verify().让我们分步来了解每个函数。

我们首先讨论password_hash()函数。这将用作创建一个新的密码的哈希值。它包含三个参数:密码、哈希算法、选项。前两项为必须的。你可以根据下面的例子来使用这个函数:
 

$password = 'foo';
$hash = password_hash($password,PASSWORD_BCRYPT);
//$2y$10$uOegXJ09qznQsKvPfxr61uWjpJBxVDH2KGJQVnodzjnglhs2WTwHu

你将注意到我们并没有给这个哈希加任何选项。现在可用的选项被限定为两个: cost 和salt。妖添加选项你需要创建一个关联数组。
 

$options = [ 'cost' => 10,
       'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM) ];

将选项添加到 password_hash() 函数后,我们的哈希值变了,这样更加安全。
 

$hash = password_hash($password,PASSWORD_BCRYPT,$options);
//$2y$10$JDJ5JDEwJDhsTHV6SGVIQuprRHZnGQsUEtlk8Iem0okH6HPyCoo22

现在哈希创建完毕了,我们可以通过 password_get_info() 查看新建哈希值得相关信息。 password_get_info() 需要一个参数——哈希值——并返回一个包含算法(所用哈希算法的整数代表形式)、算法名(所用哈希算法的可读名称)以及选项(我们用于创建哈希值得选项)的关联数组。
 

var_dump(password_get_info($hash));
/*
array(3) {
 ["algo"]=>
 int(1)
 ["algoName"]=>
 string(6) "bcrypt"
 ["options"]=>
 array(1) {
  ["cost"]=>
  int(10)
 }
}
*/

先一个被添加到 Password Hashing API 的是 password_needs_rehash(),它接受三个参数,hash、hash 算法以及选项,前两个是必填项。 password_needs_rehash()用来检查一个hash值是否是使用特定算法及选项创建的。这在你的数据库受损需要调整hash时非常有用。通过利用 password_needs_rehash() 检查每个hash值,我们可以看到已存的hash 值是否匹配新的参数, 仅影响那些使用旧参数创建的值。

最后,我们已经创建了我们的hash值,查阅了它如何被创建,查阅了它是否需要被重新hash,现在我们需要验证它。要验证纯文本到其hash值,我们必须使用 password_verify(),它需要两个参数,密码及hash值,并将返回 TRUE 或 FALSE。让我们检查一次我们获得的 hashed 看看是否正确。
 

$authenticate = password_verify('foo','$2y$10$JDJ5JDEwJDhsTHV6SGVIQuprRHZnGQsUEtlk8Iem0okH6HPyCoo22');
//TRUE
$authenticate = password_verify('bar','$2y$10$JDJ5JDEwJDhsTHV6SGVIQuprRHZnGQsUEtlk8Iem0okH6HPyCoo22');
//FALSE

通过以上知识,你可以在新的 PHP 5.5.0 版本中迅速且安全的创建 hash 密码了。

PHP 相关文章推荐
基于qmail的完整WEBMAIL解决方案安装详解
Oct 09 PHP
php 什么是PEAR?(第三篇)
Mar 19 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
Aug 22 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
php随机抽奖实例分析
Mar 04 PHP
php+mysql实现简单的增删改查功能
Jul 13 PHP
php实现表单多按钮提交action的处理方法
Oct 24 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 PHP
laravel框架中间件简单使用方法示例
Jan 25 PHP
详解PHP中的PDO类
Jul 06 #PHP
php中 $$str 中 "$$" 的详解
Jul 06 #PHP
PHP生成唯一订单号
Jul 05 #PHP
启用Csrf后POST数据时出现的400错误
Jul 05 #PHP
php超快高效率统计大文件行数
Jul 05 #PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 #PHP
PHP 获取ip地址代码汇总
Jul 05 #PHP
You might like
建立文件交换功能的脚本(三)
2006/10/09 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
不安全的常用的js写法
2009/09/15 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
vue-axios使用详解
2017/05/10 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
python中的多线程实例教程
2014/08/27 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Python测试人员需要掌握的知识
2018/02/08 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Python通过cv2读取多个USB摄像头
2019/08/28 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
JSF界面控制层技术
2013/06/17 面试题
教你打造完美的创业计划书
2014/01/06 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
学校捐书活动总结
2015/05/08 职场文书
校长新学期致辞
2015/07/30 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android