当前位置: 首页 > news >正文

RSA+AES 混合加密不复杂,但落地挺烦,我用 Vue+PHP 封装成了两个库

在项目里写接口的时候,我有时候会希望再多一层保护
虽然 HTTPS 已经能保证传输安全,但它解决的更多是「传输过程中不被窃听/篡改」的问题。
而我还想顺带做到几点:

  • 防止接口被随便模拟调用
  • 就算数据包被截获,也看不懂内容
  • 就算有人拿着同一份请求去重放,服务端也能拒绝

这些需求其实挺常见的,但并不复杂,说白了就是一套 RSA+AES 混合加密


经典的思路

原理本身没什么新鲜的:

  • 每次请求生成一个随机 AES Key
  • 用 AES 加密数据
  • 再用 RSA 公钥把 AES Key 加密后传给后端
  • 后端用 RSA 私钥解密出 AES Key,再还原请求体

这是标准做法,网上能搜到很多讲解。


真正麻烦的地方

难点其实不在原理,而是在项目里真正用的时候。

比如要自己实现,就得写:

  • 每次生成随机 AES Key
  • RSA 公钥加密 AES Key
  • AES 加密/解密请求体
  • 签名计算、时间戳校验,避免重放
  • 各种异常处理(签名错、时间戳过期、解密失败)

单看每一块都不复杂,但组合在一起就有点烦。
而且这些逻辑和业务关系不大,却不得不散落在代码里。


我做的小工具

为了省事,我干脆把它们封装成了前后端两个库:

  • 前端是一个 npm 包
  • 后端是一个 PHP 的 Composer 库

目标就是:用起来跟普通请求没什么两样,但底层自动帮你做了加解密和校验


用法示例

前端:

npm install hejunjie-encrypted-request
import { encryptRequest } from "hejunjie-encrypted-request";# 不建议在代码里写死公钥,建议通过读取文件来获取公钥字符串
const encrypted = encryptRequest({ name: "张三" }, {publicKey: "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----",
});request.post("/api/user/info", encrypted).then(res => console.log(res));

后端:

composer require hejunjie/encrypted-request
use Hejunjie\EncryptedRequest\EncryptedRequestHandler;// 自行在中间件或方法前完成请求参数的获取
$param = $_POST;// 同样不建议代码里写死私钥
// 要么私钥作为 RSA_PRIVATE_KEY 放在.env里(此方法就无需再传递$config)
// 要么直接读取文件作为配置传递
$config = ['RSA_PRIVATE_KEY' => file_get_contents(private_key.pem)
];
$handler = new EncryptedRequestHandler($config);
$data = $encrypted->handle($param['en_data'] ?? '', $param['enc_payload'] ?? '', $param['timestamp'] ?? '', $param['sign'] ?? '');print_r($data); // ['name' => '张三']

开发者只需要像平时一样写请求,库会自动处理 AES/RSA 加解密、签名、时间戳校验、异常。


适合的场景

这个方案当然不是替代 HTTPS,而是作为额外的一层保护

  • 内部系统,不希望接口被随便重放/模拟
  • 中小项目,对安全有点额外要求,但不想上很重的安全框架
  • 想快速把 RSA+AES 混合加密落地,而不用自己重复造轮子

仓库地址

  • 前端仓库:npm-encrypted-request
  • 后端仓库:php-encrypted-request

希望能帮到和我一样遇到类似需求的人。

http://www.dtcms.com/a/354472.html

相关文章:

  • XTUOJ C++小练习(素数的判断,数字塔,字母塔)
  • 亚马逊合规风控升级:详情页排查与多账号运营安全构建
  • Unity游戏打包——Android打包环境(Mac下)
  • PDF压缩如何平衡质量与体积?
  • Electron 简介:Node.js 桌面开发的起点
  • 小鹏自动驾驶的BEV占用网络有哪些优势?
  • “矿山”自动驾驶“路网”编辑功能实现
  • Mip-splatting
  • 在docker 中拉取xxl-job以及配置数据库
  • 【Linux】Linux基础开发工具从入门到实践
  • Redis 哨兵(Sentinel)全面解析
  • JavaSE丨集合框架入门:从0掌握Collection与List核心用法
  • Two Knights (数学)
  • Feign整合Sentinel实现服务降级与Feign拦截器实战指南
  • uni-app 网络请求与后端交互完全指南:从基础到实战
  • 智能养花谁更优?WebIDE PLOY技术与装置的结合及实践价值 —— 精准养护的赋能路径
  • 【LeetCode】29. 两数相除(Divide Two Integers)
  • PhotoshopImageGenerator:基于Photoshop的自动化图像数据集生成工具
  • C# 操作 DXF 文件指南
  • WAF对比传统防火墙的优劣势
  • 从Cgroups精准调控到LXC容器全流程操作​:用pidstat/stress测试Cgroups限流,手把手玩转Ubuntu LXC容器全流程​
  • 打破存储局限:CS 创世 SD NAND 如何优化瑞芯微(RK)与北京君正平台的贴片式 SD 卡性能
  • 横扫SQL面试——流量与转化率分类
  • 机器人电源电感的认证和认证细节,知多少?
  • Spring Boot 整合 SSE, http长连接
  • odoo打印新解
  • lesson48:Ubuntu下Python与三大数据库实战:MySQL、MongoDB、Redis全攻略
  • 基于uni-app的iOS应用上架,从打包到分发的全流程
  • 算法题打卡力扣第15题:三数之和(mid)
  • 本地构建的 Docker 镜像迁移到另一台电脑上运行