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
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
php使用timthumb生成缩略图的方法
Jan 22 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
laravel自定义分页效果
Jul 23 PHP
PHP代码重构方法漫谈
Apr 17 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
PHP设计模式(观察者模式)
Jul 07 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+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
比较详细的关于javascript 解析json的代码
2009/12/16 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
2016/03/23 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
在Python中使用模块的教程
2015/04/27 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
Python异常处理例题整理
2019/07/07 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
Python调用jar包方法实现过程解析
2020/08/11 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
结对共建工作方案
2014/06/02 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
师范生小学见习总结
2015/06/23 职场文书
html粘性页脚的具体使用
2022/01/18 HTML / CSS