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 相关文章推荐
用PHP制作静态网站的模板框架(三)
Oct 09 PHP
PHP数据缓存技术
Feb 14 PHP
php 自写函数代码 获取关键字 去超链接
Feb 08 PHP
了解Joomla 这款来自国外的php网站管理系统
Mar 11 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
php多重接口的实现方法
Jun 20 PHP
PHP微信开发之文本自动回复
Jun 23 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
让Laravel API永远返回JSON格式响应的方法示例
Sep 05 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
Apr 01 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版(2)
2006/10/09 PHP
PHP四种基本排序算法示例
2015/04/09 PHP
8个必备的PHP功能开发
2015/10/02 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
express框架下使用session的方法
2019/07/31 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
python中mechanize库的简单使用示例
2014/01/10 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
pytorch 修改预训练model实例
2020/01/18 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
企业总经理助理岗位职责
2014/09/12 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
无故旷工检讨书
2015/08/15 职场文书
Python使用DFA算法过滤内容敏感词
2022/04/22 Python