0

0

PHP加密与前端JS互通_统一AES密钥模式编解码【说明】

絕刀狂花

絕刀狂花

发布时间:2026-02-20 20:11:32

|

817人浏览过

|

来源于php中文网

原创

php与js用aes互通必须统一参数:cbc模式、显式16字节iv、严格16/24/32字节密钥、密文base64编码传输,否则必解密失败。

php加密与前端js互通_统一aes密钥模式编解码【说明】

PHP和JS用AES互通必须统一openssl_encryptCryptoJS.AES.encrypt的参数细节

不统一就必然解密失败,常见报错是Malformed UTF-8 data或空字符串。核心矛盾不在语言差异,而在默认行为不同:PHP的openssl_encrypt默认用PKCS#7填充、ECB/CBC模式、无IV自动补零;CryptoJS默认用PKCS#7、CBC、随机IV且Base64编码密文+IV拼接。

实操建议:

  • 强制双方都用CBC模式(ECB不安全且JS默认不暴露ECB选项)
  • PHP侧禁用自动IV生成:openssl_random_pseudo_bytes(16)生成IV,并显式传入openssl_encrypt第4个参数
  • JS侧禁用随机IV:{ iv: CryptoJS.enc.Utf8.parse('16-byte-iv-here') },且IV必须是16字节Utf8解析结果
  • 密钥必须严格16/24/32字节——PHP用mb_strlen($key, '8bit')校验,JS用CryptoJS.enc.Utf8.parse(key).toString()转成WordArray再检查长度

PHP加密后JS解密失败?先检查openssl_encrypt输出是否被二次编码

PHP默认返回原始二进制密文,而CryptoJS只接受Base64或Hex字符串输入。若直接echo密文到JS,会因不可见字符截断导致解密失败。

正确做法:

立即学习PHP免费学习笔记(深入)”;

Heeyo
Heeyo

Heeyo:AI儿童启蒙陪伴师,风靡于硅谷的儿童AI导师和玩伴

下载
  • PHP加密后立刻base64_encode()密文,再把IV也base64_encode(),拼成$ciphertext.'|'.$iv传给前端
  • JS收到后split('|')拆分,用CryptoJS.enc.Base64.parse()分别解析密文和IV
  • 切勿在PHP里用bin2hex()——CryptoJS的enc.Hex解析逻辑与PHP hex输出字节序不一致,容易出错

CryptoJS解密时抛Invalid AES key length?密钥字节长度没对齐

CryptoJS要求密钥最终为WordArray,且长度必须是128/192/256位(即16/24/32字节)。如果JS里直接传字符串'my-key',它会被按UTF-8编码后转WordArray,但PHP侧若用md5($key)sha1($key)生成固定长度密钥,两边哈希算法不一致就会错。

稳妥方案:

  • PHP侧用hash('sha256', $raw_key, true)生成32字节密钥(true表示返回原始二进制)
  • JS侧用CryptoJS.SHA256(CryptoJS.enc.Utf8.parse(raw_key)).toString(CryptoJS.enc.Base64)CryptoJS.enc.Base64.parse()还原——但更简单的是PHP把hash('sha256', $raw_key, true)结果base64_encode后传给JS,JS直接CryptoJS.enc.Base64.parse()
  • 避免用substr(md5(), 0, 16)这类截断操作——MD5是16字节,但PHP的md5()默认返回32字符hex字符串,截取前16字符只是8字节

为什么用openssl_encrypt却总遇到data not padded错误?

这个错误实际是CryptoJS解密时发现PKCS#7填充不合法,根源常在PHP侧:你可能用了OPENSSL_ZERO_PADDING但JS没同步关闭填充,或者PHP加密后被gzip压缩、JSON编码等中间环节破坏了二进制完整性。

排查重点:

  • 确认PHP加密调用中未传OPENSSL_ZERO_PADDING标志(除非JS也显式配置{ padding: CryptoJS.pad.NoPadding }
  • 确保传输过程无额外编码:比如AJAX发送时contentType: 'application/json'会导致PHP自动json_decode并可能丢弃二进制数据,改用application/x-www-form-urlencodedtext/plain
  • 前端接收响应时,用responseType: 'text'而非'json',避免浏览器自动解析破坏Base64字符串
密钥派生、IV传递、编码链路这三处任何一个环节字节级不一致,都会让AES变成单向黑洞。调试时优先比对PHP输出的Base64密文和JS输入的Base64密文是否完全一致(包括换行、空格),再逐层往回查。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

442

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

165

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

167

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

122

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

245

2024.09.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号