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 相关文章推荐
推荐一篇入门级的Class文章
Mar 19 PHP
模板引擎正则表达式调试小技巧
Jul 20 PHP
destoon复制新模块的方法
Jun 21 PHP
smarty缓存用法分析
Dec 16 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
配置Nginx+PHP的正确思路与过程
May 10 PHP
php递归函数怎么用才有效
Feb 24 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
PHP实现文字写入图片功能
Feb 18 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
python3制作捧腹网段子页爬虫
2017/02/12 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
详解Python用户登录接口的方法
2019/04/17 Python
python实现图片转字符小工具
2019/04/30 Python
python实现可变变量名方法详解
2019/07/01 Python
简单了解python反射机制的一些知识
2019/07/13 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
对python中return与yield的区别详解
2020/03/12 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
python实现猜拳游戏项目
2020/11/30 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
法学专业毕业生自荐信范文
2013/12/18 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书