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 相关文章推荐
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
Oct 09 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
Apr 22 PHP
Laravel 4 初级教程之安装及入门
Oct 30 PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
实现php删除链表中重复的结点
Sep 27 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
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
2013/04/10 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
Python的re模块正则表达式操作
2016/05/25 Python
python生成ppt的方法
2018/06/07 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
解决python线程卡死的问题
2019/02/18 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
药学专业毕业生求职信
2013/10/20 职场文书
银行门卫岗位职责
2013/12/29 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
大四毕业生自荐书
2014/07/05 职场文书
代理人委托书
2014/08/01 职场文书
2014年环保局工作总结
2014/12/11 职场文书
外出考察学习心得体会
2016/01/18 职场文书