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 相关文章推荐
php的控制语句
Oct 09 PHP
生成静态页面的php函数,php爱好者站推荐
Mar 19 PHP
php中的数组操作函数整理
Aug 18 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 PHP
如何让CI框架支持service层
Oct 29 PHP
php简单统计在线人数的方法
May 10 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
Laravel基础-关于引入公共文件的两种方式
Oct 18 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 PHP
laravel 实现根据字段不同值做不同查询
Oct 23 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
php读取目录所有文件信息dir示例
2014/03/18 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
2008/09/26 Javascript
javascript引导程序
2008/10/26 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
Python中的生成器和yield详细介绍
2015/01/09 Python
python非递归全排列实现方法
2017/04/10 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
pandas 层次化索引的实现方法
2019/07/06 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
伦敦奥运会的口号
2014/06/21 职场文书
培训班通知
2015/04/25 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python