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 相关文章推荐
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
Aug 01 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
PHP生成指定长度随机数最简洁的方法
Jul 14 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
Aug 25 PHP
Yii使用技巧大汇总
Dec 29 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
Nov 14 PHP
php 中的closure用法详解
Jun 12 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
Yii框架组件的事件机制原理与用法分析
Apr 07 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
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
PHP类型约束用法示例
2016/09/28 PHP
PDO::prepare讲解
2019/01/29 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
jQuery示例收集
2010/11/05 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
2014/05/05 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python内置函数dir详解
2015/04/14 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
python实现录音小程序
2020/10/26 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
材料成型专业个人求职信范文
2013/09/25 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
大学生自荐书范文
2015/03/05 职场文书