在现代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:分析加密库使用
常见加密库特征:
-
对称加密库:
-
CryptoJS (常见AES实现)
-
sjcl (斯坦福JS加密库)
-
WebCrypto API (现代浏览器内置)
-
-
非对称加密库:
-
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, // 需要IVmode: CryptoJS.mode.ECB, // 不需要IVmode: 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 TDA[发现加密代码] --> B{有公钥/私钥?}B -->|是| C[非对称加密]B -->|否| D{单一密钥+IV?}D -->|是| E[对称加密]D -->|否| F[可能是哈希或其它]
快速判断口诀:
-
一钥加解是对称
-
公私分明非对称
-
密钥较短是对称
-
PEM格式非对称
-
模式IV是对称
-
签名必是非对称
掌握这些识别技巧,你就能在JavaScript逆向工程中快速判断出使用的是对称加密还是非对称加密算法,为后续的深入分析打下基础。