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 相关文章推荐
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
php 破解防盗链图片函数
Dec 09 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
PHP文件操作方法汇总
Jul 01 PHP
php中array_column函数简单实现方法
Jul 11 PHP
详解PHP处理密码的几种方式
Nov 30 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
PHP实现简易计算器功能
Aug 28 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 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
PHP实现文件下载详解
2014/11/27 PHP
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
python函数返回多个值的示例方法
2013/12/04 Python
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
详细探究Python中的字典容器
2015/04/14 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
护理专业自荐信
2013/12/03 职场文书
秋季运动会加油稿200字
2014/01/11 职场文书
手机被没收检讨书
2014/02/22 职场文书
股权转让协议书
2014/04/12 职场文书
化工操作工岗位职责
2014/04/29 职场文书
消防安全承诺书
2014/05/22 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android