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的超级变量$_POST获取HTML表单(HTML Form) 数据
May 07 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
php网页标题中文乱码的有效解决方法
Mar 05 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
PHP程序员的技术成长规划
Mar 25 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
thinkPHP实现基于ajax的评论回复功能
Jun 22 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 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
基于mysql的论坛(7)
2006/10/09 PHP
php zip文件解压类代码
2009/12/02 PHP
解析MySql与Java的时间类型
2013/06/22 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
js AspxButton的客户端操作
2009/06/26 Javascript
JavaScript的变量作用域深入理解
2009/10/25 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
Javascript实现单例模式
2016/01/24 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
开源Web应用框架Django图文教程
2017/03/09 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
详解python中@的用法
2019/03/27 Python
python中pop()函数的语法与实例
2020/12/01 Python
python实现图片转字符画的完整代码
2021/02/21 Python
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
华为python面试题
2016/05/03 面试题
授权委托书怎么写
2014/04/03 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis