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中的数组操作函数整理
Aug 18 PHP
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
VIM中设置php自动缩进为4个空格的方法详解
Jun 14 PHP
解析zend Framework如何自动加载类
Jun 28 PHP
php判断是否为json格式的方法
Mar 04 PHP
PHP学习笔记之字符串编码的转换和判断
May 22 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
Oct 01 PHP
php绘图之在图片上写中文和英文的方法
Jan 24 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
Sep 25 PHP
php提交post数组参数实例分析
Dec 17 PHP
PHP封装curl的调用接口及常用函数详解
May 31 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
php实现简单加入购物车功能
2017/03/07 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
初始Nodejs
2014/11/08 NodeJs
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python 忽略warning的输出方法
2018/10/18 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
企业申诉管理制度
2014/01/30 职场文书
企业安全生产承诺书
2014/05/22 职场文书
应届本科毕业生求职信
2014/07/23 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书