PHP 加密 Password Hashing API基础知识点


Posted in PHP onMarch 02, 2020

PHP 5.5 之后引入 Password hashing API 用于创建和校验哈希密码,它属于内核自带,无需进行任何扩展安装和配置。它主要提供了四个函数以供使用:

● password_hash():创建密码的哈希;

● password_verify():验证密码是否和哈希匹配;

● password_needs_rehash():检查给定的哈希是否匹配给定的选项;

● password_get_info():返回指定哈希的相关信息。

1、password_hash(string password, int algo [, array options])

使用足够强度的单向散列算法生成密码的哈希。此函数兼容 crypt(),即由 crypt() 生成的哈希值可以使用 Password hashing API 的相关函数进行校验。

● password:用户密码。

● algo:密码算法常量。取值包括:

● PASSWORD_DEFAULT:使用 bcrypt 算法。最终生成的结果可能超过 60 个字符;

● PASSWORD_BCRYPT:使用 CRYPT_BLOWFISH 算法创建哈希。最终结果是 60 个字符的字符串,或在失败时返回 FALSE。

● salt:手动提供哈希密码的盐值。省略此项时,函数会为每个密码哈希自动生成随机的盐值。PHP 7.0 已废弃该项;

● cost:代表算法使用的 cost。默认值是 10,可根据实际情况增加。

2、password_verify(string password, string hash)

● password:用户提供的密码。

● hash:由 password_hash() 创建的哈希散列值。 如果匹配则返回 TRUE,否则返回 FALSE。时序攻击对此函数不起作用。

3、password_needs_rehash(string hash, integer algo [, array opitons])

● hash:由 password_hash() 生成的哈希;

● algo:密码算法常量;

● options:包含有关选项的关联数组。

4、password_get_info(string hash) hash:由 password_hash() 生成的哈希。 返回一个包含三个元素的关联数组:

● algo:密码算法常量;

● algoName:算法名称;

● options:调用 password_hash() 时提供的选项。

示例

$str = 'chicken,run!';
$pwd1 = password_hash($str, PASSWORD_BCRYPT);
$pwd2 = crypt($str);

var_dump(password_verify('chicken,run!', $pwd1));  // 输出 true
var_dump(password_verify('chicken,ran!', $pwd1));  // 输出 false
var_dump(password_verify($str, $pwd2));  // 输出 true
var_dump(password_needs_rehash($pwd1, PASSWORD_BCRYPT, ['cost'=>10]));  // 输出 false,因为 password_hash() 在加密时,出来默认 cost 为 10 外,还会指定随机的盐值

知识点补充:

PHP加密解密函数分享

<?php
/**
*功能:对字符串进行加密处理
*参数一:需要加密的内容
*参数二:密钥
*/
function passport_encrypt($str,$key){ //加密函数
srand((double)microtime() * 1000000);
$encrypt_key=md5(rand(0, 32000));
$ctr=0;
$tmp='';
for($i=0;$i<strlen($str);$i++){
$ctr=$ctr==strlen($encrypt_key)?0:$ctr;
$tmp.=$encrypt_key[$ctr].($str[$i] ^ $encrypt_key[$ctr++]);
}
return base64_encode(passport_key($tmp,$key));
}
/**
*功能:对字符串进行解密处理
*参数一:需要解密的密文
*参数二:密钥
*/
function passport_decrypt($str,$key){ //解密函数
$str=passport_key(base64_decode($str),$key);
$tmp='';
for($i=0;$i<strlen($str);$i++){
$md5=$str[$i];
$tmp.=$str[++$i] ^ $md5;
}
return $tmp;
}

/**
*辅助函数
*/
function passport_key($str,$encrypt_key){
$encrypt_key=md5($encrypt_key);
$ctr=0;
$tmp='';
for($i=0;$i<strlen($str);$i++){
$ctr=$ctr==strlen($encrypt_key)?0:$ctr;
$tmp.=$str[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}
$str='作者:WWW.JB51.NET;
$key='jb51net';
$encrypt=passport_encrypt($str,$key);
$decrypt=passport_decrypt($encrypt,$key);

echo '原文:',$str."<br><hr>";
echo '密文:',$encrypt."<br><hr>";
echo '译文:',$decrypt."<br><hr>";
?>

以上就是PHP 加密 Password Hashing API基础知识点的详细内容,更多关于PHP 加密:Password Hashing API的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
PHP下几种删除目录的方法总结
Aug 19 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
php模板中出现空行解决方法
Mar 08 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
Mar 25 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
Oct 19 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP实现的贪婪算法实例
Oct 17 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 #PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 #PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 02 #PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 #PHP
php 的多进程操作实践案例分析
Feb 28 #PHP
You might like
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
《APMServ 5.1.2》使用图解
2006/10/23 PHP
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
js获取Get值的方法
2016/09/29 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
浅谈vuepress 踩坑记
2018/04/18 Javascript
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
Python中对列表排序实例
2015/01/04 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
逻辑链路控制协议
2016/10/01 面试题
高级Java程序员面试要点
2013/08/02 面试题
教师的实习自我鉴定
2013/12/17 职场文书
期末评语大全
2014/05/04 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
求职导师推荐信范文
2015/03/27 职场文书
学校社团活动总结
2015/05/07 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
2016年国陪研修感言
2015/11/18 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
js中Object.create实例用法详解
2021/10/05 Javascript
Python实现双向链表
2022/05/25 Python