PHP中创建和验证哈希的简单方法实探


Posted in PHP onJuly 06, 2015

 PHP 5.5.0 带来了一份完整的全新特性与函数的列表。全新API之一就是Password Hashing API.它包含4个函数:password_get_info(), password_hash(), password_needs_rehash(),和password_verify().让我们分步来了解每个函数。

我们首先讨论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 5.5.0 版本中迅速且安全的创建 hash 密码了。

PHP 相关文章推荐
php下连接ftp实现文件的上传、下载、删除文件实例代码
Jun 03 PHP
php下统计用户在线时间的一种尝试
Aug 26 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
Apr 24 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
php+MySql实现登录系统与输出浏览者信息功能
Jul 01 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
PHP生成(支持多模板)二维码海报代码
Apr 30 PHP
PHP切割汉字的常用方法实例总结
Apr 27 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
php模拟post提交请求调用接口示例解析
Aug 07 PHP
详解PHP中的PDO类
Jul 06 #PHP
php中 $$str 中 "$$" 的详解
Jul 06 #PHP
PHP生成唯一订单号
Jul 05 #PHP
启用Csrf后POST数据时出现的400错误
Jul 05 #PHP
php超快高效率统计大文件行数
Jul 05 #PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 #PHP
PHP 获取ip地址代码汇总
Jul 05 #PHP
You might like
中国的第一台收音机
2021/03/01 无线电
PHP 日期时间函数的高级应用技巧
2009/10/10 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
网页中CDATA标记的说明
2010/09/12 Javascript
javascript复制对象使用说明
2011/06/28 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
Node.js事件驱动
2015/06/18 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
微信小程序自定义轮播图
2018/11/04 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
python运行其他程序的实现方法
2017/07/14 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
大学生毕业自荐信
2013/10/10 职场文书
公司新员工的演讲稿注意事项
2014/01/01 职场文书
初中体育教学反思
2014/01/14 职场文书
机动车登记业务委托书
2014/10/08 职场文书