当前位置: 首页 > news >正文

JavaScript逆向工程:如何判断对称加密与非对称加密

在现代Web应用安全分析中,加密算法的识别是JavaScript逆向工程的关键环节。本文将详细介绍如何在逆向工程中判断JavaScript代码使用的是对称加密还是非对称加密。

一、加密算法基础概念

1. 对称加密 (Symmetric Encryption)

  • 特点:加密和解密使用相同的密钥

  • 常见算法:AES、DES、3DES、RC4、Blowfish

  • 优点:加解密速度快,适合大数据量加密

  • 缺点:密钥分发困难

2. 非对称加密 (Asymmetric Encryption)

  • 特点:使用公钥加密,私钥解密(或反之)

  • 常见算法:RSA、ECC、ElGamal、DSA

  • 优点:安全性高,无需共享密钥

  • 缺点:加解密速度慢,不适合大数据量

二、识别加密类型的关键指标

1. 密钥特征识别法

// 对称加密特征 - 通常只有一个密钥
const key = "abcdef1234567890"; // 固定长度的密钥
const iv = "1234567890abcdef";  // 初始化向量(IV)

// 非对称加密特征 - 明显区分公钥和私钥
const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...`;
const privateKey = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAA...`;

判断要点

  • 对称加密:通常有1个密钥+可能的IV

  • 非对称加密:成对出现的公钥/私钥,结构明显(PEM格式)

2. 加密函数调用识别法

对称加密常见模式:
// AES加密典型调用
const encrypted = CryptoJS.AES.encrypt(
  "plaintext", 
  key, 
  { iv: iv, mode: CryptoJS.mode.CBC }
).toString();
非对称加密常见模式:
// RSA加密典型调用
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
const encrypted = encrypt.encrypt("plaintext");

判断要点

  • 对称加密:通常直接使用密钥进行加密

  • 非对称加密:需要先设置公钥/私钥

3. 密钥长度识别法

// 对称加密密钥长度
const aesKey = "0123456789abcdef"; // 16字节(128位)
const desKey = "abcdefgh";        // 8字节(64位)

// 非对称加密密钥长度
const rsaKey = `-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAx3j6...`; // 通常1024/2048位

判断要点

  • 对称加密:密钥长度固定(AES:128/192/256位)

  • 非对称加密:密钥长度较长(RSA通常≥1024位)

三、实战识别步骤

步骤1:搜索加密关键词

在代码中搜索以下关键词:

// 通用关键词
encrypt, decrypt, cipher, crypto, encode, decode

// 对称加密关键词
AES, DES, 3DES, RC4, Blowfish, 
CBC, ECB, CFB, OFB, CTR, GCM, // 加密模式
iv, initializationVector, salt, // 相关参数

// 非对称加密关键词
RSA, ECC, ElGamal, DSA, 
publicKey, privateKey, 
sign, verify, // 签名相关
-----BEGIN (PUBLIC|PRIVATE) KEY-----

步骤2:分析加密库使用

常见加密库特征:
  1. 对称加密库

    • CryptoJS (常见AES实现)

    • sjcl (斯坦福JS加密库)

    • WebCrypto API (现代浏览器内置)

  2. 非对称加密库

    • JSEncrypt (RSA实现)

    • forge (多种算法支持)

    • node-rsa (Node.js环境)

识别示例

// 如果看到这些初始化,很可能是非对称加密
const crypt = new JSEncrypt();
const rsa = new RSAKey();

// 如果看到这些,很可能是对称加密
const encrypted = CryptoJS.AES.encrypt(...);
const cipher = forge.cipher.createCipher('AES-CBC', key);

步骤3:跟踪密钥来源

// 对称加密密钥通常:
// 1. 硬编码在代码中
// 2. 从服务器获取
// 3. 通过密钥派生函数(PBKDF2)生成

// 非对称加密密钥通常:
// 1. 以PEM格式存储
// 2. 通过证书加载
// 3. 动态生成(如RSA密钥对)

四、典型案例分析

案例1:对称加密识别

// 典型AES加密实现
function encryptData(data) {
  const key = CryptoJS.enc.Utf8.parse("1234567890abcdef");
  const iv = CryptoJS.enc.Utf8.parse("abcdef1234567890");
  const encrypted = CryptoJS.AES.encrypt(data, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.toString();
}

识别特征

  • 使用CryptoJS库

  • 明确的key和iv

  • 指定了加密模式(CBC)和填充方式(Pkcs7)

  • 单一密钥

案例2:非对称加密识别

// 典型RSA加密实现
function rsaEncrypt(data) {
  const encryptor = new JSEncrypt();
  encryptor.setPublicKey(`-----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz6XQhVj7JY...
    -----END PUBLIC KEY-----`);
  return encryptor.encrypt(data);
}

识别特征

  • 使用JSEncrypt库

  • 明显的PEM格式公钥

  • 设置公钥后加密

  • 没有对称加密的iv参数

五、进阶识别技巧

1. 加密模式识别

// 对称加密常见模式特征
{
  mode: CryptoJS.mode.CBC,  // 需要IV
  mode: CryptoJS.mode.ECB,  // 不需要IV
  mode: CryptoJS.mode.GCM   // 认证加密
}

// 非对称加密通常不指定模式

2. 加密操作上下文分析

  • 对称加密常见场景:

    • 大量数据加密

    • 通信内容加密

    • 本地存储加密

  • 非对称加密常见场景:

    • 密钥交换

    • 数字签名

    • 小数据量加密

3. 性能特征分析

// 非对称加密通常只加密小块数据
rsaEncrypt(JSON.stringify({ token: "abc123" }));

// 对称加密可能加密大量数据
aesEncrypt(largeFileContent);

六、工具辅助识别

1. Chrome开发者工具

  • 在Sources面板搜索加密关键词

  • 使用XHR断点捕获加密请求

2. Frida动态插桩

// 监控CryptoJS调用
Interceptor.attach(Module.findExportByName("libcrypto.so", "AES_encrypt"), {
  onEnter: function(args) {
    console.log("AES加密调用 detected");
  }
});

3. Burp Suite观察

  • 观察请求特征:

    • 对称加密:数据长度与明文成比例

    • 非对称加密:固定长度输出(如RSA 2048位总是256字节)

七、总结判断流程图

graph TD
    A[发现加密代码] --> B{有公钥/私钥?}
    B -->|是| C[非对称加密]
    B -->|否| D{单一密钥+IV?}
    D -->|是| E[对称加密]
    D -->|否| F[可能是哈希或其它]

快速判断口诀

  • 一钥加解是对称

  • 公私分明非对称

  • 密钥较短是对称

  • PEM格式非对称

  • 模式IV是对称

  • 签名必是非对称

掌握这些识别技巧,你就能在JavaScript逆向工程中快速判断出使用的是对称加密还是非对称加密算法,为后续的深入分析打下基础。

相关文章:

  • LLM应用开发(七)--记忆
  • 聊一聊接口测试时遇到第三方服务时怎么办
  • map映射到二维数组
  • Windows下安装depot_tools
  • 云曦月末断网考核复现
  • 力扣HOT100之链表: 148. 排序链表
  • queue容器
  • 3.软考高项(信息系统项目管理师)-范围管理
  • Openssl升级至openssl9.8p1含全部踩坑内容
  • Socket多路复用网络编程应用总结
  • RDD行动算子和累加器
  • 低代码控件开发平台:飞帆中粘贴富文本的控件
  • C++学习中常见的数组越界问题及解决方案
  • fit 转 gpx
  • w286入校申报审批系统设计与实现
  • 单片机方案开发 代写程序/烧录芯片 九齐/应广等 电动玩具 小家电 语音开发
  • Gemini Deep Research惊艳升级:2.5 Pro模型带来的研究效率革命
  • Transformer 多卡并行计算-SimpleDataset设计:`labels`;input_ids;attention_mask是什么
  • 加速度计芯片的主要参数定义、计算、测试方法
  • 【LaTeX】
  • 科技公司企业网站源码/百度收录提交入口网址
  • 厦门景观绿环建设行业协会网站/app开发用什么软件
  • 幼儿园网站模板/全球十大搜索引擎
  • 哪里有做php网站免费教程/网络口碑营销案例分析
  • 做网站和app需要多久/新闻热点事件2021(最新)
  • 网站做不做301/如何制作网站最简单的方法