php加解密

一 对称加密

1.mycyrpt的对称加密:

/*** @param $key  //数据加密密钥 由自己定义,长度有限制 string* @param $string  //需要进行加解密的字符串 string* @param $decrypt //加密还是解密 (最简单的,0代表加密,1代表解密)* @return string*/
function encryptDecrypt($key, $string, $decrypt)
{if(!$decrypt) {//加密$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));return $encrypted;} else {//解密$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");return $decrypted;}}//使用方法:
echo encryptDecrypt('passwordgg', 'Hello欢迎您',0);  //加密  ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=
echo encryptDecrypt('passwordgg', 'ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=',1);  //解密  Hello欢迎您

参考加密文档 php.net

参考解密文档  php.net

注: 此方法php7.1开始已经被废弃,开始采用openssl_encrypt和openssl_decrypt , 官方推荐使用openssl一族进行加解密

 

2.OpenSSL 扩展中的对称加密

/*** @param string $data 需要加解密的数据字符串 string* @param int $yes 加密还是解密(1表示加密,0表示解密)* @param string $key 数据加密密钥* @param string $iv 初始化向量 //注:这里为了显示效果,暂时将iv存储到session中,* @param string $iv 实际应用中,应该将iv和加密后的字符串都存储在数据库* @param string $encryptMethod  数据加密方式 100余种,可通过openssl_get_cipher_methods()函数获取,* @param string $encryptMethod  选择其中一种(如果选择cbc结尾的加密算法,需要初始化向量iv,如本例)* @return string*/
function openssl_crypt($data = '', $yes = 1, $key = 'secret', $iv = '', $encryptMethod = 'aes-256-cbc')
{if($yes) {$ivLength = openssl_cipher_iv_length($encryptMethod); //获取该加密算法iv应该具有的长度$iv = openssl_random_pseudo_bytes($ivLength, $isStrong); //生成iv(初始化向量)if (false === $iv && false === $isStrong) {die('IV generate failed');}//加密$encrypted = openssl_encrypt($data, $encryptMethod, $key, 0, $iv);$_SESSION['iv'] = $iv; //将iv存到session中return $encrypted;} else {//解密$decrypted = openssl_decrypt($data, $encryptMethod, $key, 0, $iv);return $decrypted;}
}//使用方法
echo $a = openssl_crypt('我爱北京天安门 /我爱祖国',1,'passG506'); //加密 LMcwSGlTFijXRdcPaccYoc08xgr7NydtZ+Wrhdv/145gF3/ayKQCJvRLmvhs5ec8
echo "<br>";
echo openssl_crypt($a,0,'passG506',$_SESSION['iv']); //解密 我爱北京天安门 /我爱祖国

注: 1. 为什么要生成iv,iv的作用是什么

回顾一下 openssl_get_cipher_methods() 返回的加密算法列表,有很多名字中间带有 “CBC” 字样,这些加密算法使用了同一种加密模式,也就是 密码分组链接模式(Cipher Block Chaining)。

 

在 CBC 模式的加密算法中,明文会被分成若干个组,以组为单位加密。每个组的加密过程,依赖他前一个组的数据:需要跟前一组的数据进行异或操作后生成本组的密文。那么最开头的那个组又要依赖谁呢?依赖的就是 IV,所以这就是为什么 IV 要叫初始化向量。IV 是 初始化向量(initialization vector)的缩写

IV 应该是随机生成的,所以代码用到了 openssl_random_pseudo_bytes() 生成 IV。该函数接收一个 int,代表需要生成的 IV 的长度。

IV 长度随加密算法不同而不同。一般人是记不住那么多算法需要的 IV 长度的。所以直接使用 openssl_cipher_iv_length() 函数,这个函数返回一个 int,表示加密算法需要的 IV 长度:

echo openssl_cipher_iv_length('AES-256-CBC'); // 16
echo openssl_cipher_iv_length('BC-CBC'); // 8
echo openssl_cipher_iv_length('AES-128-ECB'); // 0

比如 AES-256-CBC 需要16位的 IV、 BC-CBC 需要 8 位的 IV、而AES-128-ECB 不需要 IV,所以返回了 0。

 

2. 在使用过程中需要注意的问题

在进行加解密时,两个函数除了第一个参数不同,其余参数都要保证相同才能顺利解密。最后,在使用需要 IV 的加密算法时,需要注意:

必须传 $iv 参数,不传的话PHP将会抛出一个 Warning
IV 应该是随机生成的(比如用 openssl_random_pseudo_bytes() ),不能人为设定
每次加密都应该重新生成一次 IV ,不可偷懒多次加密采用相同 IV
IV 要随着密文一起保存(不然就没法解密啦),可以直接附在密文串后面,也可以分开保存

如果看不懂,可以参考对称加密

 

二 非对称加密

 

常用的非对称加密有RSA算法,非对称加密和解密使用的是不同的密钥,其中一个对外公开作为公钥,另一个只有私有者拥有,作为私钥。

用私钥加密的信息只有公钥才能解开,或者反之用公钥加密的信息只有私钥才能解开。

在RSA加解密之前,需要先生成一对公私钥,可使用Linux自带的RSA密钥生成工具openssl获取一对公私钥,也可以使用PHP openssl扩展函数生成一对公私钥。

 

示例代码:

---以后再补----

可参考:RSA非对称加密

 

注:非对称加密的缺点是机密和解密花费时间长,速度慢,只适合对少量数据进行加密。

如果既想有很快的加密速度,又想保证数据比对称加密更安全,可以使用混合加密。(即 对数据进行对称加密,对密钥做非对称加密)

解密的时候,先用非对称加密得到密钥,再用密钥解开密文得到明文。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解Spring Boot数据源与连接池原理

​ Create by ysterfoxmail.com 2018-8-2一&#xff1a;开始 在使用Spring Boot数据源之前&#xff0c;我们一般会导入相关依赖。其中数据源核心依赖就是spring‐boot‐starter‐jdbc 如下 <dependency><groupId>org.springframework.boot</groupId> …

Dapr 集成 Open Policy Agent 实现 接口的访问控制

大型项目中基本都包含有复杂的访问控制策略&#xff0c;特别是在一些多租户场景中&#xff0c;例如Kubernetes中就支持RBAC&#xff0c;ABAC等多种授权类型。Dapr 的 中间件 Open Policy Agent 将Rego/OPA策略应用到传入的Dapr HTTP请求中。Open Policy AgentOpen Policy Agent…

【Java】BigDecimal

一、前言 在使用Java&#xff0c;double 进行运算时&#xff0c;经常出现精度丢失的问题&#xff0c;总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中&#xff0c;通过一个公式校验该值是否大于0&#xff0c;如果大于0我们会做一件事情&#xff0c;小于0我们又处理其他…

PHP获取当前页面URL

//获取页面url function curPageURL() {$pageURL http;if (!empty($_SERVER[HTTPS])) {$pageURL . "s";}$pageURL . "://";if ($_SERVER["SERVER_PORT"] ! "80") {$pageURL . $_SERVER["SERVER_NAME"].":".$_SER…

【招聘(大连)】北森云计算 .NET 专场招聘

为了更好的实现战略布局&#xff0c;逐步形成以三个产品研发中心&#xff08;北京、成都、大连&#xff09;为主&#xff0c;青岛和南京为辅的产品研发团队配置。北森云第三研发中心&#xff08;大连&#xff09;正式成立&#xff0c;目前大连的人选招聘正式开启&#xff0c;欢…

PHP强制下载文件

//有时我们不想让浏览器直接打开文件&#xff0c;如PDF文件&#xff0c;而是要直接下载文件&#xff0c;那么以下函数可以强制下载文件 //函数中使用了application/octet-stream头类型。 function downloads($filename,$dir./) {$filepath $dir.$filename;if (!file_exists($f…

F5基于证书认证的客户端登录

1.生成密钥RSA类型&#xff0c;密码&#xff1a;123456保存为Openssl格式2.上传客户机SecureCRT生成的公钥 Identity.pub到用户home目录下.ssh文件夹中cd .sshmv Identity.pub authorized_keys ##cat .ssh/id_rsa.pub >> ~/.ssh/authorized_keys3.更改F5 ssh配置文件tmsh…

C#多线程编程-必知必会

“发现问题的能力&#xff0c;运用技术解决问题的能力&#xff0c;是一个技术人成长的关键”图片故事&#xff1a;洋姜的花&#xff0c;拍摄于2022年7月23日&#xff0c;地点&#xff1a;北京奥林匹克森林公园 &#xff0c;摄影师&#xff1a;刘先生概要&#xff1a;使用C#发起…

理解Go Interface

理解Go Interface1 概述Go语言中的接口很特别&#xff0c;而且提供了难以置信的一系列灵活性和抽象性。接口是一个自定义类型&#xff0c;它是一组方法的集合&#xff0c;要有方法为接口类型就被认为是该接口。从定义上来看&#xff0c;接口有两个特点:接口本质是一种自定义类型…

『中级篇』Dockerfile详解(17)

一般的&#xff0c;Dockerfile 分为四部分&#xff1a;基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 ####官网学习 https://docs.docker.com/engine/reference/builder/#usage ####FROM 必须为第一个命令&#xff0c;指定基础镜像 FROM <image> FROM &…

洛谷 1165日志分析

题目描述 M 海运公司最近要对旗下仓库的货物进出情况进行统计。目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志。该日志记录了两类操作&#xff1a;第一类操作为集装箱入库操作&#xff0c;以及该次入库的集装箱重量&#xff1b;第二类操作为集装箱的出库操作。这些…

KestrelServer详解[1]:注册监听终结点(Endpoint)

具有跨平台能力的KestrelServer是最重要的服务器类型。针对KestrelServer的设置均体现在KestrelServerOptions配置选项上&#xff0c;注册的终结点是它承载的最重要的配置选项。这里所谓的终结点&#xff08;Endpoint&#xff09;与“路由”介绍的终结点不是一回事&#xff0c;…

php截取字符串,带中文,多余的省略号代替

function subtext($text, $length) {if(mb_strlen($text, utf8) > $length) {return mb_substr($text, 0, $length, utf8)....;} else {return $text;}}$str 我们是family happy family; echo subtext($str,5); //我们是fa...

数据库添加

<body><form action"herozhuce.php" method"post"> <div>账号<input type"text" name"account"/></div> <div>密码<input type"text" name"password"/></div> &…

快来加入阿里云大学【云学院】班级助理招募—机会稍纵即逝,错过遥遥无期!...

2019独角兽企业重金招聘Python工程师标准>>> 如果你对云计算、大数据、云安全、人工智能领域感兴趣~ 如果你想从事与此相关的工作~~ 如果你又喜欢边交流边学习的方式~ 那么&#xff0c;加入我们吧&#xff01; 我们将为你提供一个广阔的平台&#xff0c;让你接触到云…

深入理解ajax系列第五篇——进度事件

前面的话 一般地&#xff0c;使用readystatechange事件探测HTTP请求的完成。XHR2规范草案定义了进度事件Progress Events规范&#xff0c;XMLHttpRequest对象在请求的不同阶段触发不同类型的事件&#xff0c;所以它不再需要检査readyState属性。这个草案定义了与客户端服务器通…

对象(poco)深度克隆

提供深度克隆对象功能,基于编译表达式实现&#xff0c;性能与原生代码几无差别&#xff0c;远超 json/binary 序列化实现。1. 简单示例class Person {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public DateTime Birth { get; s…

php将数字转化为中文大写人民币格式

<?phpfunction cny($ns) {static $cnums array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"),$cnyunits array("圆","角","分&…

BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA

欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1787 题意概括 有一棵节点为n个(n≤500000)的树。接下来m次询问(m≤500000)&#xff0c;每次给出3个点 a,b,c &#xff0c;现在让你求一个点 p &#xff0c;使得 dis(p,a) dis(p,b) dis(p,c) 最…

Linux之ACL权限控制

ACL权限控制主要目的是提供传统的owner,group,other的read,wirte,execute权限之外的具体权限设置&#xff0c;可以针对单一用户或组来设置特定的权限 设置ACL权限&#xff1a;setfacl查看ACL权限&#xff1a;getfacl 比如&#xff1a;某一目录权限为 drwx------ 2 root root 40…