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面向对象的方法重载两种版本比较
Sep 08 PHP
Look And Say 序列php实现代码
May 22 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
PHP中对缓冲区的控制实现代码
Sep 29 PHP
php 字符串压缩方法比较示例
Jan 23 PHP
php实现的百度搜索某地天气的小偷代码
Apr 23 PHP
调试PHP程序的多种方法介绍
Nov 06 PHP
php实现四舍五入的方法小结
Mar 03 PHP
php中strlen和mb_strlen用法实例分析
Nov 12 PHP
php自定义截取中文字符串-utf8版
Feb 27 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
Oct 08 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 一个随机字符串生成代码
2010/05/26 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
php文件包含的几种方式总结
2019/09/19 PHP
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
最短的IE判断代码
2011/03/13 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
python k-近邻算法实例分享
2014/06/11 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
Python编程之string相关操作实例详解
2017/07/22 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
python 编写简单网页服务器的实例
2018/06/01 Python
django实现模型字段动态choice的操作
2020/04/01 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
法学院毕业生求职信
2014/06/25 职场文书
七一建党日演讲稿
2014/09/05 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
Python 多线程处理任务实例
2021/11/07 Python
Axios代理配置及封装响应拦截处理方式
2022/04/07 Vue.js