PHP和java交互对传输数据加密的方案
2026-03-18
PHP 和 Java 之间做“加密传输”,能共同使用的远不止 Base64。
先说一个关键点:Base64 不是加密,它只是编码。它的作用是把二进制数据转成可传输的文本,方便放进 JSON、URL、Header 里。真正的“加密”,一般是下面这几类。
一、最常用的对称加密
对称加密的意思是:加密和解密用同一把密钥。
优点是快,适合传输业务数据。
PHP 和 Java 都很好对接。
1. AES
这是最常见、最通用的一种。
常见模式有:
AES-128-CBC
AES-256-CBC
AES-128-ECB
AES-256-ECB
AES-GCM
其中真正推荐的是:
AES-CBC
这是老牌常用方案。
特点是兼容性强,PHP 和 Java 都容易实现。
但要注意两点:
第一,必须有 iv(初始向量)
第二,最好配合签名校验,不然可能被篡改
AES-GCM
这是更现代的方案。
它不但能加密,还能校验数据有没有被改过,也就是“带认证的加密”。
优点很明显:
安全性更高
不需要你自己再额外拼一个 HMAC 才能防篡改
Java 支持很好,PHP 新版本也支持
如果你是新系统对接,我更建议优先考虑 AES-GCM。
2. DES / 3DES
PHP 和 Java 也都能做。
但现在基本不推荐了,因为:
DES 太老,安全性弱
3DES 也逐渐被淘汰,性能和安全性都不如 AES
除非对接老系统,否则别优先选它。
二、非对称加密
非对称加密的意思是:加密和解密不是同一把钥匙,而是一对公钥和私钥。
适合这些场景:
我给你发数据,但我不想提前共享同一个密钥
做密钥交换
做签名验签
做敏感字段保护
1. RSA
这是 PHP 和 Java 之间最经典的非对称方案。
能做两件事:
用公钥加密,私钥解密
适合传输小段敏感数据,比如:
AES 密钥
token
验证码
临时会话参数
注意:RSA 不适合直接加密很大的业务报文,因为长度有限,而且性能差。
用私钥签名,公钥验签
这个在接口对接里非常常见。
比如:
请求体原文 + 时间戳 + nonce
然后用私钥签名
对方用公钥验签
这套很适合做“防伪造、防篡改”。
2. ECC / ECDSA / ECIES
这类椭圆曲线算法也能跨 PHP 和 Java 用,但实现和对接复杂度比 RSA 高一些。
常见用途:
ECDSA:数字签名
ECDH:协商共享密钥
优点是密钥短、安全性高。
但如果你们团队不是特别熟,初次对接不建议一上来就选这个,容易踩格式坑。
三、摘要与签名类
这类不是“加密内容”,而是用来做完整性校验、防篡改、防伪造。
1. HMAC
这是 PHP 和 Java 对接里特别实用的一类。
常见的有:
HMAC-SHA256
HMAC-SHA1
HMAC-SHA512
作用是:
双方约定一个 secret
对请求内容做摘要签名
对方按同样规则重算
一致则说明内容没被改,且请求方掌握 secret
这个在接口鉴权里非常常见。
你之前做 JWT HS256,本质上就是 HMAC-SHA256 的应用。
2. SHA 系列摘要
比如:
SHA-256
SHA-512
MD5
注意:
纯 SHA 或 MD5 只是摘要,不是加密,也不能防伪造。
因为任何人拿到原文都能自己算一遍。
所以它适合:
文件校验
内容指纹
去重标识
不适合单独拿来做接口安全认证。
3. RSA 签名
常见组合:
SHA256withRSA
这个是对接里非常经典的一套。
过程是:
发送方用私钥签名
接收方用公钥验签
它比“纯 SHA”强得多,因为对方没有私钥就伪造不了签名。
四、跨 PHP 和 Java 最常见的几种可落地组合
方案一:AES + Base64
适合内部系统、双方都能安全共享密钥的场景。
流程一般是:
原文
→ AES 加密
→ 得到二进制密文
→ Base64 编码
→ 放到 JSON 里传输
接收方则反过来:
Base64 解码
→ AES 解密
→ 得到原文
这是最常见的一套。
方案二:AES + HMAC + Base64
这是非常实用、也非常稳的一套。
流程是:
原文用 AES 加密
再对关键内容计算 HMAC-SHA256
最后密文和签名都 Base64 或十六进制编码传输
优点:
既保密
又能防篡改
这是很多企业接口都在用的方案。
方案三:RSA + AES
这是更标准的混合加密方案。
流程是:
业务数据用 AES 加密
AES 密钥再用 RSA 公钥加密
一起传给对方
对方先用 RSA 私钥解出 AES 密钥
再用 AES 解业务数据
优点:
不需要提前共享固定对称密钥
更适合跨组织对接
这是很多正式系统、支付系统、政企系统常用思路。
方案四:RSA 签名 + AES 加密
这是企业接口里很强的一套。
它同时解决三个问题:
数据保密:AES
数据完整:签名
身份可信:RSA 私钥签名
如果你们是正式对外接口,这套非常像样。
五、PHP 和 Java 对接时最容易踩的坑
真正难的,不是“算法有没有”,而是两边细节必须完全一致。很多人说“同样都是 AES,怎么解不开”,其实是这些细节不一致。
1. 模式必须一致
比如:
AES/CBC/PKCS5Padding
AES/ECB/PKCS5Padding
AES/GCM/NoPadding
如果一边是 CBC,一边是 ECB,必炸。
2. 密钥长度必须一致
AES-128 对应 16 字节
AES-192 对应 24 字节
AES-256 对应 32 字节
不是 16 个汉字,也不是 16 个字符就一定对,必须按字节数看。
3. IV 必须一致
CBC、GCM 等模式都需要 IV。
一边用了随机 IV,另一边没传过去,也解不开。
4. 填充方式要一致
Java 里常写:
PKCS5Padding
PHP 里很多时候对应也能兼容,但本质上在 AES 场景下通常按 PKCS7 理解。
实践中最重要的是:两边产出的结果一致,不要只看名字。
5. 字符集要一致
原文转字节时,要统一 UTF-8。
否则中文会出问题。
6. 编码格式要一致
密文传输时到底用:
Base64
十六进制 hex
原始二进制
一定要说清楚。
很多“解密失败”其实不是算法问题,而是一边传的是 hex,一边按 Base64 解。
7. RSA 密钥格式要一致
RSA 特别容易在这里翻车。
常见区别有:
PKCS#1
PKCS#8
X.509
PEM
DER
Java 和 PHP 都支持 RSA,但密钥格式必须统一,不统一就会各种报错。
六、如果你问“最推荐哪种”
看场景。
场景一:内网系统、双方都能安全保存同一个密钥
推荐:
AES-GCM
次选:
AES-CBC + HMAC-SHA256
场景二:企业与企业正式接口
推荐:
AES 加密业务数据
RSA 加密 AES 密钥
RSA 或 HMAC 做签名
场景三:只做接口签名,不需要加密正文
推荐:
HMAC-SHA256
或者 SHA256withRSA
场景四:只是做 token、短报文、防伪造
推荐:
JWT HS256
或者 RSA 签名方案
七、给你一个最通俗的理解
可以把它们理解成几种不同工具。
Base64:装箱子,不是上锁
AES:一把双方都知道的门锁,速度快
RSA:一把公开挂在门口的锁,只有私钥主人能开
HMAC:封条,证明东西没被拆过
SHA:指纹,说明内容长什么样,但不能证明是谁发的
所以一个成熟的接口安全方案,往往不是只用一种,而是组合使用。
最常见的成熟组合就是:
用 AES 负责“保密”
用 HMAC 或 RSA 签名负责“防篡改、验身份”
用 Base64 负责“可传输”
八、你现在如果是做 PHP 对 Java 对接,我给你的实战建议
最稳妥的是优先选下面两套之一。
简化版
AES-CBC + Base64 + HMAC-SHA256
适合你们自己掌控双方系统,开发实现快,兼容性高。
标准版
AES-GCM + Base64
或者
RSA + AES 混合加密 + 签名
适合正式企业接口,长期维护更规范。
发表评论: