【PHP】对称加密算法 AES-256-GCM 代码示例

前言

下面介绍在PHP代码中,如何对数据进行 AES-256-GCM 加密和解密。我们可以使用 openssl 和 sodium 扩展来实现加密,它们都支持 AES-256-GCM 算法,下面将给出两种扩展的代码示例。

注:在对称加密算法中,除了应用广泛的 AES 以外,还有一种名为 ChaCha20-Poly1305 的新式加密算法,它的性能比 AES 更好(如果CPU支持AES指令硬件加速,则AES性能更好),安全性也不输AES。sodium 扩展支持 ChaCha20-Poly1305。

环境

PHP 7.3

一、使用openssl扩展

<?phpfunction aes256gcm_encrypt(string $data, string $keygen, string $aad = ''): array
{$cipher = 'aes-256-gcm';$ivLen = openssl_cipher_iv_length($cipher);$iv = random_bytes($ivLen); // 12字节的iv$encrypt = openssl_encrypt($data, $cipher, $keygen, OPENSSL_RAW_DATA, $iv,$tag, $aad);return ['iv'          => base64_encode($iv),'tag'         => base64_encode($tag),'aad'         => base64_encode($aad),'cipher_text' => base64_encode($encrypt),];
}function aes256gcm_decrypt(array $secretData, string $keygen)
{$iv = base64_decode($secretData['iv']);$tag = base64_decode($secretData['tag']);$aad = base64_decode($secretData['aad']);$cipherText = base64_decode($secretData['cipher_text']);$cipher = 'aes-256-gcm';return openssl_decrypt($cipherText, $cipher, $keygen, OPENSSL_RAW_DATA, $iv, $tag, $aad);
}function main()
{// AES-256-GCM需要32字节的密钥$keygen = bin2hex(random_bytes(16));// 加密$data = 'Hello World!';$secretData = aes256gcm_encrypt($data, $keygen, 'foobar');// 解密$plainText = aes256gcm_decrypt($secretData, $keygen);echo "原文:$data\n";echo "密文数据:" . json_encode($secretData) . "\n";echo "解密后:$plainText\n";
}main();

二、使用 sodium 扩展

<?phpfunction aes256gcm_encrypt(string $data, string $keygen, string $aad = ''): array
{$iv = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);$encrypt = sodium_crypto_aead_aes256gcm_encrypt($data, $aad, $iv, $keygen); // 包含密文、tagreturn ['iv'          => sodium_bin2base64($iv, SODIUM_BASE64_VARIANT_ORIGINAL),'aad'         => sodium_bin2base64($aad, SODIUM_BASE64_VARIANT_ORIGINAL),'cipher_text' => sodium_bin2base64($encrypt, SODIUM_BASE64_VARIANT_ORIGINAL),];
}function aes256gcm_decrypt(array $secretData, string $keygen)
{$iv = sodium_base642bin($secretData['iv'], SODIUM_BASE64_VARIANT_ORIGINAL);$aad = sodium_base642bin($secretData['aad'], SODIUM_BASE64_VARIANT_ORIGINAL);$cipherText = sodium_base642bin($secretData['cipher_text'], SODIUM_BASE64_VARIANT_ORIGINAL);return sodium_crypto_aead_aes256gcm_decrypt($cipherText, $aad, $iv, $keygen);
}function main()
{if (!sodium_crypto_aead_aes256gcm_is_available()) {exit('Not support AES-256-GCM');}// 生成AES-256-GCM的密钥$keygen = sodium_crypto_aead_aes256gcm_keygen();// 加密$data = 'Hello World!';$secretData = aes256gcm_encrypt($data, $keygen, 'foobar');// 解密$plainText = aes256gcm_decrypt($secretData, $keygen);echo "原文:$data\n";echo "密文数据:" . json_encode($secretData) . "\n";echo "解密后:$plainText\n";
}main();

AAD参数(Additional Authenticated Data)

在上面的代码示例中,可以看到在加密的时候有一个$aad参数,如果在加密的时候使用了这个参数,那么在解密时也需要使用同样的AAD值才能成功解密。

什么时候会需要用到AAD呢?下面举个例子:
用户Alice在CSDN博客上写了一篇私密文章,CSDN使用 AES-256-GCM 加密了这篇文章,然后存储到了数据库里,AAD的取值是Alice的用户ID。

后续如果Alice去查看这篇文章,CSDN会使用Alice的用户ID(AAD值)去解密,因为解密的AAD值与加密的AAD值相同,所以可以成功解密。

然后有一个黑客Bob,他也向CSDN发出解密这篇文章的请求,CSDN就会使用Bob的用户ID作为AAD去解密这篇文章,但因为AAD值错误,肯定是解密不了的,所以这时候AAD的作用就体现了出来。

参阅

  • https://cloud.google.com/kms/docs/additional-authenticated-data?hl=zh-cn

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

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

相关文章

【ChatGLM2-6B】P-Tuning训练微调

机器配置 阿里云GPU规格ecs.gn6i-c4g1.xlargeNVIDIA T4显卡*1GPU显存16G*1 准备训练数据 进入/ChatGLM-6B/ptuningmkdir AdvertiseGencd AdvertiseGen上传 dev.json 和 train.json内容都是 {"content": "你是谁", "summary": "你好&…

【代码随想录】算法训练计划11

1、20. 有效的括号 题目&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号…

AI:53-基于机器学习的字母识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

推荐PHP付费进群源码

PHP付费进群源码带自动定位基于ThinkPHP框架开发的&#xff0c;可以快速搭建知识付费粉丝进群。 更新&#xff1a; 1.首页付款轮播 2.城市定位功能 3.更新及优化域名库及支付设置 4.新增一张图模板设置模式&#xff0c;简化后台模板设置 5.前后台其他优化 演示地址&#xff1a…

使用navicat操纵数据库

<1>连接数据库 打开Navicat&#xff0c;点击“连接”&#xff0c;选择“MySQL”&#xff0c;这边是本机安装的mysql,主机为localhost&#xff0c;输入root密码。 使用Navicat创建数据库并导入SQL文件 SQL查询 普通SQL查询 USE demo; SELECT * FROM t_emp;SELECT emp…

动态内存malloc,calloc,realloc如何使用,使用场景及使用free释放内存时崩溃的原因

目录 1.内存区域 2.void与void* 3.应用场景 4.malloc 5.calloc 6.realloc 7.free崩溃的原因 7.1引入 7.2具体原因 7.2.1越界 7.2.2指针移动 7.2.3重复释放同一段内存 1.内存区域 局部变量:定义在函数内部的变量,包括形参,在栈(stack)中,作用域在函数内部有效,生存周…

【缓存】Spring全家桶中@CacheEvict无效情况共有以下几种

Spring全家桶中CacheEvict无效情况共有以下几种 一、背景介绍二、原因分析三、解决方案 一、背景介绍 SpringBoot中使用Cacheable注解缓存数据&#xff0c;使用CacheEvict注解删除缓存。但是在项目使用过程中&#xff0c;发现使用CacheEvict注解删除缓存无效。 拓展&#xff…

Redis那些事儿(一)

说到redis大家都不陌生&#xff0c;其中包括&#xff1a;共有16个数据库&#xff0c;默认为第0个数据库&#xff1b;数据以key-value键值的形式存储&#xff1b;数据类型包括String、List、Hash、Set等&#xff0c;其中最常用的是字符串&#xff1b;是单线程的、基于内存的&…

腾讯云优惠券是什么?腾讯云优惠券怎么领取?

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;为了吸引用户上云&#xff0c;经常推出各种优惠活动&#xff0c;其中就包括腾讯云优惠券。 1、腾讯云优惠券解释说明 腾讯云优惠券是腾讯云的一种优惠凭证&#xff0c;包括代金券和折扣券&#xff0c;领券之后新购、续费、升…

AD9371 官方例程裸机SW 和 HDL配置概述(三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

前端之jQuery

目录 一、jQuery jQuery内容 jQuery版本 jQuery对象 jQuery基础语法 二、查找标签 基本选择器 层级选择器 基本筛选器 属性选择器 表单筛选器 三、筛选器方法 四、操作标签 一、jQuery jQuery是一个轻量级的、兼容多浏览器的JavaScript库。jQuery使用户能够更方便…

管理如何实现制度流程化 流程表单化 表单信息化 信息标准化?

业务化、流程化、信息化、数字化、自动化、智能化&#xff0c;是企业业务管理发展路径的六个必经阶段 制度业务化&#xff0c;业务表单化&#xff0c;表单流程化、流程信息化、信息标准化、标准制度华。 制度流程化、流程表单化、表单信息化、信息标准化、标准制度华。 管理…

Windows安装WinDbg调试工具

一.下载 微软官网下载SDK的地址&#xff0c;有win11&#xff0c;win10&#xff0c;win8&#xff0c;win7&#xff0c;其他 https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/ 二.安装 打开windbg\Installers\X64 Debuggers And Tools-x64_en-us.msi 要安…

《Effective C++》知识点(6)--继承与面向对象设计

32. 确定你的public继承模式是is-a关系 重要规则&#xff1a;public继承就意味is-a的关系。适用于基类身上的每一件事情一定也适用于继承类身 上&#xff0c;因为每一个继承类对象也都是一个基类对象。 另外两种关系是has-a(有一个)和is-implemented-in-terms-of(根据某物实现出…

[揭秘]splunk 背后running 的job

1: 背景: 最近客户总是会收到一些dashboard 的PDF 文件,有些内容不是想要的,想要求更新一下,但是问题来了,这些dashboard 的自动运行的job 在哪里呢? 2: 查找原因: 2.1 如果知道这个dashboard 发到那个email 的,那么可以查找: abc@163.com 去: /opt/splunk/etc/use…

【Redis】String字符串类型-常用命令

文章目录 String字符串类型常用命令setgetMGETMSET 计数命令INCRINCRBYDECRDECRBYINCRBYFLOAT 其它命令APPENDGETRANGESETRANGESTRLEN 命令总结 String字符串类型 1&#xff09;⾸先Redis中所有的键的类型都是字符串类型 2&#xff09;字符串类型的值&#xff08;value&#…

数据结构详细笔记——并查集

文章目录 逻辑结构存储结构并、查代码实现Union 操作的优化Find 操作的优化&#xff08;压缩路径&#xff09; 逻辑结构 集合&#xff1a;将各个元素划分为若干个互不相交的子集的集合 森林是m(m>0)棵互不相交的树的集合 存储结构 #define SIZE 13 int UFSets[SIZE]; …

linux环境下编译,安卓平台使用的luajit库

一、下载luajit源码 1、linux下直接下载&#xff1a; a、使用curl下载&#xff1a;https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz b、git下载地址&#xff1b;https://github.com/LuaJIT/LuaJIT.git 2、Windows下载好zip文件&#xff0c;下载地址&#xff1a;https…

云计算、大数据、人工智能、物联网、虚拟现实技术、区块链技术(新一代信息技术)学习这一篇够了!

目录 云计算 一、云计算的基本概念 二、云计算的分类 (一) IaaS (二) SaaS (三) PaaS 三、云环境的分类、云计算的四种部署模式 (一)公有云 (二)私有云 (三)社区云 (四)混合云 四、云计算的特点 (一)虚拟化技术 (二)动态可扩展 (三)按需部署 (四)灵活性高 (五…

左偏树学习笔记

定义 堆&#xff0c;是一棵树&#xff0c;且每个节点的键值都大于等于 / 小于其父亲的键值。 左偏树是一种可合并的堆&#xff0c;可以以 O ( log ⁡ n ) O(\log n) O(logn) 的复杂度实现合并。 性质 左偏树满足堆的性质。 我们设定一个值 dist \text{dist} dist&#xf…