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 相关文章推荐
用PHPdig打造属于你自己的Google[图文教程]
Feb 14 PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
Dec 02 PHP
PHP源码之explode使用说明
Aug 05 PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 PHP
PHP swfupload图片上传的实例代码
Sep 30 PHP
教你如何使用php session
Oct 28 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
PHP中的output_buffering详细介绍
Sep 27 PHP
php实现的日历程序
Jun 18 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
thinkPHP中配置的读取与C方法详解
Dec 05 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
PHP4中实现动态代理
2006/10/09 PHP
php数组中删除元素的实现代码
2012/06/22 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
php正则修正符用法实例详解
2016/12/29 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python调用java的Webservice示例
2014/03/10 Python
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
windows下ipython的安装与使用详解
2016/10/20 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
中学校庆方案
2014/03/17 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
先进个人材料怎么写
2014/12/30 职场文书
鼋头渚导游词
2015/02/05 职场文书
介绍信格式样本
2015/05/05 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
小学家庭教育心得体会
2016/01/14 职场文书