JavaScript 怎么对后端返回的加密接口数据进行前端解密

胖明大大_8813

胖明大大_8813

2026-09-05

867人浏览

原创

前端解密后端数据需严格匹配算法、密钥、iv、填充和编码;依赖web crypto api或cryptojs等库,须先确认后端具体方案(如aes-128-cbc)、密钥来源、iv传递方式、base64/hex编码及pkcs#7等填充。

javascript 怎么对后端返回的加密接口数据进行前端解密

前端解密后端返回的加密数据,核心在于前后端使用**完全一致的加密算法、密钥、IV(初始化向量)、填充方式和编码格式**。JavaScript 本身不内置对称/非对称解密能力,需依赖 Web Crypto API(现代浏览器)或成熟第三方库(如 CryptoJS、forge),且必须与后端严格对齐参数。

确认后端使用的具体加密方案

这是最关键的一步。不能凭猜测写解密逻辑。需明确以下信息:

  • 算法类型:AES-128-CBC、AES-256-GCM、RSA-OAEP、SM4-CBC 等(注意国密 SM2/SM4 需额外支持)
  • 密钥来源:是固定密钥?还是通过登录后动态协商(如 RSA 加密传输 AES 密钥)?或是从 localStorage / cookie 读取?
  • IV 或 nonce:是否随数据一起返回(常见于 CBC/GCM 模式)?长度是否正确(如 AES-CBC 要求 16 字节)?
  • 数据编码:后端返回的是 base64?hex?还是直接二进制流(需用 Uint8Array 处理)?
  • 填充方式:PKCS#7?ZeroPadding?GCM 无需填充。

使用 Web Crypto API 解密(推荐,原生安全)

适用于现代浏览器(Chrome 80+、Firefox 69+、Edge 79+)。以 AES-CBC 为例:

假设后端返回 JSON:{"data": "base64密文", "iv": "base64 IV"}

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
async function decryptAES(dataB64, ivB64, keyStr) {
  // 1. 将 base64 转为 Uint8Array
  const ciphertext = base64ToArrayBuffer(dataB64);
  const iv = base64ToArrayBuffer(ivB64);

  // 2. 导入密钥(注意:keyStr 必须是原始密钥字节,不是字符串直接转!)
  // 若后端用 password派生密钥(如 PBKDF2),此处需先执行 deriveKey
  const key = await crypto.subtle.importKey(
    'raw',
    new TextEncoder().encode(keyStr), // ⚠️仅当 keyStr 是原始密钥字节时才这样用
    { name: 'AES-CBC' },
    false,
    ['decrypt']
  );

  // 3. 执行解密
  const decrypted = await crypto.subtle.decrypt(
    { name: 'AES-CBC', iv },
    key,
    ciphertext
  );

  // 4. 转为字符串(假设 UTF-8)
  return new TextDecoder().decode(decrypted);
}

function base64ToArrayBuffer(base64) {
  const bin = atob(base64);
  const len = bin.length;
  const buf = new ArrayBuffer(len);
  const view = new Uint8Array(buf);
  for (let i = 0; i 

<h3>使用 CryptoJS(兼容旧浏览器,但注意安全风险)</h3>
<p>若需支持 IE 或老版本浏览器,可用 CryptoJS,但需确保版本与后端一致(如 CryptoJS 3.1.2 对应某些 Java 后端实现):</p>
<pre class="brush:javascript;toolbar:false;">// 注意:CryptoJS 默认使用 OpenSSL 格式密钥派生(EVP_BytesToKey),若后端未用此方式,必须手动对齐
const CryptoJS = require('crypto-js');

function decryptWithCryptoJS(ciphertextB64, keyStr, ivB64) {
  const ciphertext = CryptoJS.enc.Base64.parse(ciphertextB64);
  const iv = CryptoJS.enc.Base64.parse(ivB64);
  const key = CryptoJS.enc.Utf8.parse(keyStr); // ⚠️仅当 keyStr 是原始 16/24/32 字节密钥时才正确

  const decrypted = CryptoJS.AES.decrypt(
    { ciphertext },
    key,
    {
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
      iv
    }
  );

  return decrypted.toString(CryptoJS.enc.Utf8);
}

⚠️警告:CryptoJS 的 parse 行为易出错;密钥长度不符会静默失败;不推荐用于新项目。

处理密钥协商与敏感信息防护

前端永远不该硬编码密钥,也不该从不可信来源加载密钥:

  • 登录成功后,后端可返回一个临时 AES 密钥(用 RSA 公钥加密传输),前端用私钥(或由服务端托管)解出,再解业务数据
  • 更安全的做法是:敏感解密逻辑放在后端,前端只请求“已解密结果”,避免密钥和算法暴露
  • 若必须前端解密,请确保密钥通过 HTTPS 安全传输,且不在 DevTools 控制台、日志或 source map 中泄露

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6070

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5426

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4983

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6070

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5598

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

783

5

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4586

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习