前端怎么对接口参数做加密才安全?

卫华 ☘︎ 阅读 5

我们项目现在要对所有请求参数加密,后端用的是 AES,但我在前端用 crypto-js 加密后,后端老是解密失败,说 padding 不对。我试过 ECB 和 CBC 模式都不行,是不是前端根本不能做这种加密?

这是我的加密代码:

import CryptoJS from 'crypto-js';

const key = CryptoJS.enc.Utf8.parse('1234567890123456');
const encrypted = CryptoJS.AES.encrypt('{"id":123}', key, {
  mode: CryptoJS.mode.ECB,
  padding: CryptoJS.pad.Pkcs7
}).toString();
我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
西门恩硕
问题在于 CryptoJS 的 AES.encrypt 默认输出的是 OpenSSL 格式(带头的 Base64),不是纯密文。后端直接解"裸"密文当然失败。

把代码改成这样:

import CryptoJS from 'crypto-js';

const key = CryptoJS.enc.Utf8.parse('1234567890123456');
const encrypted = CryptoJS.AES.encrypt('{"id":123}', key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});

// 只取 ciphertext 部分,转成 Base64
const ciphertext = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
console.log(ciphertext);


如果后端用的是 Hex,改成 encrypted.ciphertext.toString(CryptoJS.enc.Hex)

另外 CBC 模式记得前后端用同一个 IV,别忘了 iv 也是要 Base64 编码后传输的。
点赞
2026-03-13 15:01