RSA+AES 混合加密的三个坑

最近在对接第三方的开放接口。对方的规矩是:请求体用 AES 加密,AES 密钥再用平台 RSA 公钥加密后一起发过去。

标准的 hybrid 方案,看着没难度。结果联调花的时间比写业务代码还多。三个坑,全都栽在「同一个名词、双方理解不一样」上。

坑一:Base64 密文里的 + 变成了空格

我把密文直接塞进表单 body,本地测试全通过,上了环境却偶发失败。抓包才看到 a+b/c= 里的 + 变成空格了。

原因是 application/x-www-form-urlencoded 会把 + 解码成空格。密文是随机字节,平均几十个字符就撞上一次,所以它表现为「偶发」------最烦的那种 bug。

改用 JSON body 提交,一次性解决。

坑二:RSA 的 padding 文档里没写

文档只写了「RSA 加密」四个字。我按推荐的安全实践用了 OAEPWithSHA-256AndMGF1Padding,对方解不开;换回 PKCS1Padding 才通。

这里有个连带知识点:padding 不同,单次能加密的明文上限也不同。2048 位密钥下,PKCS1 是 117 字节,OAEP(SHA-256) 只剩约 62 字节。这也是为什么长报文必须用混合加密------RSA 本身扛不住。

坑三:getBytes() 偷用了默认字符集

content.getBytes() 不传参,就用系统默认值。我本机 UTF-8 一切正常,部署到 GBK 默认的测试机后,中文姓名全线乱码。更阴的是解密流程本身「成功」了,日志一个报错都没有。

现在一律显式指定:

ini 复制代码
byte[] plain = content.getBytes(StandardCharsets.UTF_8);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

一句话经验

加解密的算法实现几乎不会写错,真正吃时间的是传输编码、填充模式、字符编码这三层------恰恰是文档里最常被省略的部分。下次再对接加密接口,我会先把这三项列成清单让对方逐条确认,再写第一行代码。


你们对接第三方加密接口时踩过什么坑?评论区聊聊。

相关推荐
新*2 分钟前
Elasticsearch 7.17 的 SQL 到底能查到什么?一次踩坑记录
后端·sql·elasticsearch·查询
卷无止境25 分钟前
SALib敏感性分析的python库学习笔记
后端·python
ServBay27 分钟前
从 Val Town 停服看,代码能下载不代表项目能搬家
后端·sqlite
我不会起名字3222 小时前
seq 空洞排查:Mongo 的 51 只是预留上界,Redis CURR 才是已消耗边界
redis·后端·mongodb·go·即时通讯·im·故障排查
特立独行的猫A2 小时前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python
学长毕设2 小时前
基于SpringBoot的高校后勤报修管理系统-附源码
java·spring boot·后端
特立独行的猫A2 小时前
cj-tauri vs Rust/Tauri 同款播放器实测:编译 21 秒 vs 11 分钟,磁盘 12 MB vs 1.2 GB
java·后端·python
乐橙开放平台3 小时前
海康和大华摄像头能统一管理吗?可以通过 GB28181 或视频融合平台接入
网络·后端·物联网·音视频
一条Go6 小时前
OnCall 时段路由:跨午夜、左闭右开与「Local 不是时区」
后端·架构·github
Moment6 小时前
不会后期的我,发现了一个开源胶片神器😍😍😍
前端·后端·开源