使用PHP实现对称加密和解密过程,真的是太简单了!

news2024/11/24 10:35:02

🚀 个人主页 极客小俊
✍🏻 作者简介:web开发者、设计师、技术分享博主
🐋 希望大家多多支持一下, 我们一起进步!😄
🏅 如果文章对你有帮助的话,欢迎评论 💬点赞👍🏻 收藏 📂加关注

使用php实现简单的对称加密和解密过程

为什么我们要加密?

加密是为了信息传递更加安全!

这样才能更好的让信息传递更具有保密性,不会被他人随意篡改、也能够让信息真实有效的到达指定对象的手里!

我们加密的目的,多数是围绕这上面这些情况来的!

举个栗子

在信息通信过程当中,比如你发送一条重要信息给对方, 在这个过程中其实有很多人可以利用一些技术手段接触到这一段信息! 如果是很重要的信息但个别人利用,说不一定就会产生严重的经济损失!

例如: 信息中包含了一些敏感信息,如身份证、银行卡、密码、而这些敏感信息是最容易被人偷窥的!

如图

为了避免出现以上的情况,我们就要将信息进行加密处理, 这样子即便是被人拿到了关键信息,他也是在短时间内无法查看的,也就是让任何第三方都无法直接读取和读懂的信息!

只有发送方接收方能看懂整个数据传输的信息。

加密系统的简单架构

加密的产生过程,简单点说其实就是: 明文+密钥+算法=密文

如图

从上面的图来看,其实明文算法都还是比较好理解,但其中有一个叫密钥的东西,它就好比是像彼此约定好了的暗号一样, 也是最简单的加密方式!

举个栗子

从生活中我们用一个锁家里的门来举例的话,就是家中有价值的物品,就是你的明文、那么密钥就是你的钥匙,那么算法就是你是通过什么样的情况来锁门的! 当门锁好之后,那么一个就形成了一个加密状态了!

所以这个密钥通常都是需要保密的,就是这个意思,你总不可能把你的钥匙随便丢吧!

对称加密

那么在计算机中,我们也一些有比较安全和常见的加密方式, 例如:对称加密

对称加密其实分为两种形式: 对称加密非对称加密

简单的说对称加密也就是加密解密都会使用同样密钥

非对称加密则恰恰相反,这种加密解密使用的是不同密钥

AES对称加密算法

AES全称:advanced encryption standard 它是密码学中的高级加密标准,也是美国联邦政府采用的区块加密的标准,也是当下比较流行的对称密码算法!

我们前面提到的对称加密中就包含了AES 也就是加密解密都会使用同样密钥加密算法

简单的说发送方明文密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文再发送出去!

接收方如果想解读明文, 那么需要使用加密用过的密钥相同算法然后按照与加密时相反的顺序逆推算法对密文进行解密,才能使其恢复成可读的明文信息!

前面说了,在对称AES加密算法中,使用的密钥只有一个, 发送方接收方都使用这个密钥对数据进行加密解密,那么这就要求解密的一方事先必须知道加密密钥对吧!

如图

这就像是它要求发送方接收方在通信之前,约定一个密钥(暗号)

对称算法的安全性依赖于密钥,如果泄漏密钥就意味着任何人都可以对他们发送接收的数据进行解密

所以密钥的保密性对AES通信的安全性至关重要!

对称加密算法的优点在于加密和解密快速和使用长密钥时的难破解性,而这种加密算法支持长度为 128比特的密钥长度, 同时也支持192、256比特一共三种选择!

我们知道加密的核心在于密钥算法本身其实最终都会被破解的,所以现在流行的密码算法都是公开的,所以从密码学的角度而言也没有人去保密算法来提高安全性,所以说对于现在某些密码攻击手段对于一些高级加密标准算法本身并没有效果,真正核心的还是密钥, 这里密钥的长度直接就会影响到蛮力攻击要取得成功需要耗费相当长的时间,而这种对称加密算法安全性取决于密钥的保存情况来决定!

所以普通情况下,没有特殊需求,基本上首先的是AES加密

应用场景

这里我简单说一个案例

假设我们现在有一个包含用户个人信息的JSON对象,需要进行加密处理

如下

{  
  "name": "张三",  
  "age": 30,  
  "email": "zhangsan@example.com",  
  "phone": "13812345678"  
}

那么此时我们可以使用一些加密算法,比如:AES、RSA 对这个JSON对象中的一些数据进行加密处理。

然后加密之后的数据会变成一串密文,用户是无法直接阅读和理解。

例如:使用AES算法加密上述JSON对象,结果可能类似于以下形式:

{  
  "name": "张三",  
  "age": 30,  
  "email": "zhangsan@example.com",  
  "phone": "tv/yxsWlDIPHOnD50WVnFw=="  
}

现在可以看到,加密后的JSON对象中的phone电话字段已经被替换为一串看似随机的字符串,我们是无法直接读取原始的手机号的, 这样也对整个JSON对象也变得难以理解和解析。

这里加密后的JSON数据需要解密后才能还原为原始数据,而解密过程加密相反

需要使用相应的解密算法密钥来还原数据。

PHP实现AES对称加密

我们来实现一个简单的加密案例,有兴趣的朋友可以来看看,java、php、python等等用什么语言都可以!

我用php中的OpenSSl扩展库来实现AES对称加密与解密

不用我们去了解底层,只需要轻松几步就可以实现一个简单加密和解密数据的过程!

代码如下

<?php  
  
function encryptAES($data, $key, $iv) {    
    $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);  
    $encrypted = base64_encode($encrypted);  
    return $encrypted;  
}  
  
function decryptAES($encryptedData, $key, $iv) {  
    $encryptedData = base64_decode($encryptedData);  
    $decrypted = openssl_decrypt($encryptedData, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);  
    return $decrypted;  
}  
  
// 加密数据  
$data = 'Hello-World!';  
$key = '0123456789abcdef';
$iv = '1234567890abcdef';
  
$encryptedData = encryptAES($data, $key, $iv);  
echo '加密后的数据:' . $encryptedData;  

echo '<hr>';

// 解密数据  
$decryptedData = decryptAES($encryptedData, $key, $iv);  
echo '解密后的数据:' . $decryptedData;  
  
?>

效果如下

代码分析

这里简单的使用到了phpOpenSSl扩展库openssl_encryptopenssl_decrypt函数来实现的AES

openssl_encrypt函数解释

如下表

参数列表含义
参数1:data待加密的明文信息数据, 也就是需要加密的数据,你可以把它想象成你想要锁起来的秘密信息
参数2:method加密方式, 也就是你想要用来加密数据加密算法, 常见的加密算法包括 AES, 具体可以查看官方文档 例如: 你使用 AES-256-CBC 算法,那么 CBC 表示加密模式256 表示密钥的长度
参数3:key约定加密和解密的一把钥匙, 而这把密钥的长度必须与所选择的加密算法相匹配…例如,如果使用 AES-256-xxx,那么你的密钥应该是 256 位长! 所以我们最好要给定相应字节长度的字符串密钥,虽然有时候我们没有定义指定长度的字符的密钥,但仍然能够成功加密数据,是因为PHPOpenSSL扩展自动处理了密钥的填充和生成! 但是为了确保最佳的安全性,最好显式地指定一个符合长度要求的密钥! 这样可以避免任何潜在的填充问题,并确保密钥的长度与所选加密算法的要求相匹配, 比如说: 在 AES-256 算法中,密钥的长度为 32 字节(256 位)的字符串就可以了! 这里我采用的是AES,而AES密钥的长度通常可以是128位、192位、256位
参数4:options它可以控制如何处理返回的数据, 它有两种常量设置方式: OPENSSL_RAW_DATAOPENSSL_ZERO_PADDING 例如,你可以设置 OPENSSL_RAW_DATA 常量选项,这样函数会返回原始的二进制数据,一把也都设置这个!
参数5:iv它是一个初始化向量, 用于增加加密安全性随机性! 这里所谓的初始化向量其实就是一个随机字符串,但是这个随机字符串是有一定讲究的,它的字符长度通常需要与加密模式的要求相匹配, 也就是说不同的加密模式可能会有不同的iv要求, 例如: 当我们使用AES-256-CBC加密模式时,iv参数应该至少为16字节长度的随机字符串, 如果使用AES-128-CBC加密模式时, iv参数必须为16字节长度的随机字符串,多一个或少一个都会报错! 所以iv这个参数,最好是要和加密模式中的长度一致就行了! 为了更加安全,这个iv最好不能写死,用一种算法方式生成指定长度的iv 这样子在每次加密操作时都会改变加密结果!

返回值:成功时返回加密后的字符串

openssl_decrypt函数解释

如下表

参数列表描述
参数1:data要解密的数据字符串,通常是由 openssl_encrypt 函数加密后的结果。
参数2:method填写加密方式,既然要解密那么就要知道是如何加密的,所以这里就必须填写与加密时使用的算法模式相同! 例如: 加密模式AES-256-CBC 那么这里就必须填写AES-256-CBC
参数3:key解密密钥。这是用于解密的密钥,与加密时使用的密钥相同! 举个生活上的案例,你用什么钥匙锁门,那么你就要用相应的钥匙来开门,对吧! 并且这个密钥的长度也要一致!
参数4:options数据以什么形式进行处理并返回 它有两种常量设置方式: OPENSSL_RAW_DATAOPENSSL_ZERO_PADDING , 加密时设置的什么,这里就设置什么!
参数5:iv解密时需要使用加密时相同的 iv

所以在上面的案例中encryptAES函数接受要加密的数据、密钥初始向量,并返回加密后的结果。

而且decryptAES函数接受加密后的数据、密钥初始向量,并返回解密后的原始数据。

特别注意的是密钥初始向量的长度,必须要符合加密算法的要求!

大致流程如下图:

小结

看到这里你也应该大致了解了一下对称加密了吧, 其实关于对称加密还有很多有趣的内容,以后可以慢慢给跟大家分享!

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多 好玩 好用 好看的干货教程可以 点击下方关注❤️ 微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇

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

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

相关文章

[yarn]yarn异常

一、运行一下算圆周率的测试代码&#xff0c;看下报错 cd /home/data_warehouse/module/hadoop-3.1.3/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-3.1.3.jar pi 1000 1000 后面2个数字参数的含义&#xff1a; 第1个1000指的是要运行1000次map任务 …

【Element】隐藏 el-table 展开行的箭头

需求 点击行展开行&#xff0c;隐藏箭头 方法 首先需求是点击行显示展开行 row-click"rowClick"const rowClick (row: any, column: any, event: any) > {console.log(row, column, event)if (multipleTable.value) {multipleTable.value.toggleRowExpansio…

存储虚拟化讲解

目录 存储虚拟化的分类 按照虚拟化发生的位置分类 基于主机的虚拟化 基于存储设备的虚拟化 基于网络的虚拟化 按照虚拟化实现方式分类 带内虚拟化 带外虚拟化 按照虚拟化的对象分类 虚拟机磁盘类型 按照磁盘的特性分类 按照磁盘的安全性分类 什么是虚拟化 存储虚拟…

许战海战略文库 | 从“物美价廉”到“技术出海”:中国车企新能源时代如何征服全球市场?

引言&#xff1a;从燃油车到新能源汽车,中国车企的海外战略正在经历一次深刻的转变。面临技术、产业链和文化等多重挑战,他们如何调整步伐,捕捉新的机遇&#xff0c;同时避免潜在风险,将决定其在全球市场的未来地位。 在燃油车时代&#xff0c;中国车企凭借“物美价廉”赢得了一…

基于SSM的“大学生艺术节”管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Powerpoint不小心被覆盖?PPT误删文件如何恢复?

PowerPoint不小心删除了&#xff0c;这可能是众多学生和工作人员最头痛的事情了。PPT被覆盖或误删可能意味着几个小时的努力付之东流。那么PPT覆盖的文档要如何救回来呢&#xff1f;小编将会在本篇文章中为大家分享几个解决方案&#xff0c;使PPT文档覆盖还原操作成为可能&…

Go:如何在GoLand中引用github.com中的第三方包

本篇博客主要介绍如何在GoLand中引入github.com中的第三方包。具体步骤如下&#xff1a; 正文 (1) 先在GoLand中打开go的工作区目录(即环境变量$GOPATH设置的变量)。如图&#xff1a; 关于工作区目录中的三个子目录: bin: 保存已编译的二进制可执行程序&#xff1b;pkg: 保…

OpenAI首届开发者大会多项更新汇总

OpenAI Dev Day 提供了多项更新&#xff0c;总结如下&#xff1a; GPT 4-Turbo - 现在可以通过API使用GPT 4-Turbo。- 提供了更长的128k令牌上下文&#xff0c;之前为32k。- 相比GPT-4&#xff0c;成本降低了50%以上。- 知识更新至2023年4月&#xff0c;之前为2021年9月。- 性…

JAVA 版小程序商城免费搭建 多商家入驻 直播带货 商城系统 B2B2C 商城源码之 B2B2C产品概述

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

快速搭建UmiJS4.0项目及常见问题解决方案

yarn create umi选择项目类型 ○ Pick Umi App Template │ Simple App选择创建工具 ○ Pick Npm Client │ yarn选择源 ○ Pick Npm Registry │ taobao启用 Prettier&#xff08;可选&#xff09; yarn umi g √ Pick generator type Enable Prettier -- Setup Pr…

Cesium 相机设置

1.setView 直接跳转到目的地 // 设置相机位置 const position Cesium.Cartesian3.fromDegrees(113, 31, 20000); // setView通过定义相机目的地&#xff08;方向&#xff09;,直接跳转到目的地 viewer.camera.setView({ destination: position, // 位置设置 orientation: { //…

【C/PTA——循环结构3】

C/PTA——循环结构3 7-1 二分法求多项式单根1.题目要求2.代码实现 7-2 循环-十进制转化1.题目要求2.代码实现 7-3 梅森数1.题目要求2.代码实现 7-4 单词长度1.题目要求2.代码实现 7-5 21循环-求和31.题目要求2.代码实现 7-6 21循环-金字塔1.题目要求2.代码实现 7-7 循环-杨辉三…

Vue技巧大揭秘:v-show与v-if的区别及性能对比一目了然

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、v…

房产网小程序源码 房产中介小程序源码 房产网源码

房产网小程序源码 房产中介小程序源码 房产网源码 功能介绍&#xff1a; 一、付费发布信息 支持付费发布、刷新、置顶房源信息&#xff1b;二、个人发布信息 支持个人和房产经纪人发布房源信息&#xff1b;三、新房楼盘模块 支持新房楼盘功能&#xff0c;后台添加…

单链表(3)

现在有一个指针p&#xff0c;指向数据2所在的结点的地址——那么如何访问这个数据2 前面说过指针访问数据成员使用的是 指向符->。则访问这个数据2就是——p->data.因为p一开始就指向数据2的结点地址了 那么如何访问数据3,4往后等等 访问3就是——p->next->data…

MFC-TCP网络编程客户端-Socket

目录 1、客户端创建流程&#xff1a; 2、UI设计&#xff1a; 3、代码实现&#xff1a; &#xff08;1&#xff09;、ConnectSocket中重写OnReceive函数接收信息 &#xff08;2&#xff09;、框架类入口函数初始化 &#xff08;3&#xff09;、加入房间功能实现 &#xff…

新闻稿大纲怎么写框架?纯干货

新闻稿大纲在新闻报道中的重要性不言而喻&#xff0c;首先大纲能够提高写作效率&#xff0c;有了一份详细的大纲&#xff0c;可以帮助我们迅速组织思路&#xff0c;梳理采访内容&#xff0c;明确文章的结构和主题&#xff0c;避免在写作过程中出现不必要的拖延。 其次&#xf…

数据结构之AVL树

map/multimap/set/multiset这几个容器有个共同点是: 其底层都是按照二叉搜索树来实现的,但是普通的二叉搜索树有其自身的缺陷, 假如往树中插入的元素有序或者接近有序, 二叉搜索树就会退化成单支树, 时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了…

【 Docker: 数据卷挂载】

背景 Docker只提供了容器运行的必备依赖&#xff0c;但是一些编辑等操作的依赖是不支持的&#xff0c;如vi操作容器内部文件、将静态资源拷贝到容器内来等。 docker pull nginx docker run -d -p 81:80 --namemynginx -v D:/docker/nginx/www:/usr/share/nginx/www -v D:/dock…

性能测试资源监控宝藏工具:iDB Dashboard

iDB Dashboard 是 TiDB 自 4.0 版本起提供的图形化界面&#xff0c;可用于监控及诊断 TiDB 集群。TiDB Dashboard 内置于 TiDB 的 PD 组件中&#xff0c;无需独立部署&#xff1a; https://docs.pingcap.com/zh/tidb/v4.0/dashboard-intro