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网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
php中使用session防止用户非法登录后台的方法
Jan 27 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
php对文件进行hash运算的方法
Apr 03 PHP
php抓取并保存网站图片的实现代码
Oct 28 PHP
浅谈php中curl、fsockopen的应用
Dec 10 PHP
php实现文件与16进制相互转换的方法示例
Feb 16 PHP
Laravel实现短信注册的示例代码
May 29 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 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开启gzip页面压缩实例代码
2010/03/11 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
深入理解javaScript中的事件驱动
2013/05/21 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
div模拟滚动条效果示例代码
2013/10/16 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
12个非常有用的JavaScript技巧
2017/05/17 Javascript
javascript自定义事件功能与用法实例分析
2017/11/08 Javascript
详解微信小程序实现WebSocket心跳重连
2018/07/31 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
Python处理字符串之isspace()方法的使用
2015/05/19 Python
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
Python numpy数组转置与轴变换
2019/11/15 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
园长自我鉴定
2013/10/06 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
五分钟演讲稿
2014/04/30 职场文书
大学生毕业评语
2014/12/31 职场文书
圣诞节开幕词
2015/01/29 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书