PHP 5.5 创建和验证哈希最简单的方法详解


Posted in PHP onNovember 07, 2013

我们首先讨论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 相关文章推荐
10个实用的PHP代码片段
Sep 02 PHP
php判断变量类型常用方法
Apr 24 PHP
解析csv数据导入mysql的方法
Jul 01 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
PHP多文件上传实例
Jul 09 PHP
再谈PHP中单双引号的区别详解
Jun 12 PHP
PHP验证码类ValidateCode解析
Jan 07 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
Nov 07 #PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 #PHP
php去除HTML标签实例
Nov 06 #PHP
php实现监听事件
Nov 06 #PHP
php生成扇形比例图实例
Nov 06 #PHP
php多用户读写文件冲突的解决办法
Nov 06 #PHP
php生成图形(Libchart)实例
Nov 06 #PHP
You might like
php array的学习笔记
2012/05/16 PHP
Yii学习总结之安装配置
2015/02/22 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
深入探讨前端框架react
2015/12/09 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
Python面向对象class类属性及子类用法分析
2018/02/02 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
Python中格式化字符串的四种实现
2020/05/26 Python
Python通过字典映射函数实现switch
2020/11/06 Python
开朗女孩的自我评价
2014/02/10 职场文书
2014年元旦感言
2014/03/06 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
2014年设计师工作总结
2014/11/25 职场文书
大学毕业生个人总结
2015/02/28 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
电力安全学习心得体会
2016/01/18 职场文书