php 7.4 加密算法支持取决于底层 openssl 版本,需通过 openssl_get_cipher_methods() 和 openssl_get_md_methods() 检查实际可用算法,gcm 模式须验证 $tag 输出能力;java 18 原生支持 sha-3 和 aes/gcm,但国密算法需 bouncy castle,aes-256-gcm 等互通需严格对齐 iv、tag 和填充方式。

PHP 7.4 和 Java 18 在加密算法支持上存在显著差异,直接混用会导致跨语言加解密失败、NoSuchAlgorithmException 抛出或解密结果乱码。
确认 PHP 7.4 实际可用的加密算法
PHP 7.4 默认启用 OpenSSL 扩展,但具体支持哪些算法取决于底层 OpenSSL 版本(非 PHP 版本本身):
第一步:运行 php -r "print_r(openssl_get_cipher_methods());" 查看全部可用对称加密方法。重点关注是否含 aes-128-gcm、aes-256-gcm、chacha20 等现代算法。
第二步:执行 php -r "print_r(openssl_get_md_methods());" 检查摘要算法,确认 sha3-256、sha3-512 是否在列表中——PHP 7.4 原生不支持 SHA-3,需 OpenSSL 1.1.1+ 且编译时开启 SHA3 支持。
第三步:验证 GCM 模式是否带认证标签输出能力。调用 openssl_encrypt($data, 'aes-128-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag),若 $tag 变量为空或报错,则说明当前 OpenSSL 不支持 GCM 认证输出(常见于 OpenSSL 1.0.2 或旧版系统包)。
验证 Java 18 的原生算法覆盖范围
Java 18 是 LTS 版本,已全面支持 JDK 9 起引入的 SHA-3 系列和 JDK 11 起强化的 TLS 协议,但部分算法仍需显式启用:
方法一:检查 MessageDigest 是否支持 SHA3-256
MessageDigest.getInstance("SHA3-256") 若抛 NoSuchAlgorithmException,说明未启用 SHA-3——Java 18 默认启用,但某些裁剪版 JRE(如 jlink 构建的镜像)可能移除了 sun.security.provider.SecureRandom 之外的算法提供者。
方法二:测试 AES/GCM/NoPadding 是否可用
Java 18 原生支持 GCM,但必须使用 【12 字节 IV】,且认证标签长度必须为 12、13、14、15 或 16 字节;传入 8 字节 IV 会直接抛异常,不是静默降级。
方法三:验证国密算法支持状态
Java 18 不内置 SM2/SM3/SM4。若代码中出现 "SM4/ECB/PKCS5Padding",必须提前注册 Bouncy Castle 提供者并使用 bcprov-jdk18on 依赖,否则必抛 NoSuchAlgorithmException。
关键算法兼容性交叉对照
以下组合在 PHP 7.4 + OpenSSL 1.1.1k 与 Java 18 + OpenJDK 18.0.2 下可互通:
AES-256-CBC:双方均支持,但 PHP 的 openssl_encrypt 默认填充 PKCS7,而 Java 的 PBKDF2WithHmacSHA256 密钥派生方式不同,必须统一为 PKCS5Padding 并手动处理补位。
AES-256-GCM:双方都支持,但注意 PHP 输出的 $tag 是二进制,Java 解密时须用 cipher.updateAAD() 加载附加认证数据,并将 tag 作为 cipher.doFinal(ciphertext, 0, ciphertext.length, output, 0) 的末尾字节传入——【PHP 的 tag 必须原样传给 Java,不可 hex2bin 二次转换】。
HMAC-SHA256:完全兼容,PHP 用 hash_hmac('sha256', $data, $key, true),Java 用 Mace.getInstance("HmacSHA256"),输出字节流一致。
SHA-256:无差异,但 PHP 的 hash('sha256', $data, true) 与 Java 的 MessageDigest.getInstance("SHA-256").digest($data) 结果相同。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











