JS逆向:RSA加密
字数 1270 2025-08-18 11:36:53
JS逆向:RSA加密分析实战教程
一、RSA加密基础认知
在进行JS逆向分析时,了解常见加密方法的特征至关重要:
-
常见加密方法的密文长度特征:
- MD5加密:16位或32位
- SHA1加密:40位
- RSA加密:通常较长(128位以上),每次加密结果不同
-
RSA加密的典型JS实现模式:
var o = new JSEncrypt(); o.setPublicKey("公钥内容"); o.encrypt("明文内容");
二、案例一分析:gm99.com登录密码加密
1. 定位关键代码
- 直接搜索"password:"快速定位
- 密码加密流程:
a.encode(t.password, s),其中:t.password:用户输入密码s:时间戳
2. 加密过程分析
- 使用jsencrypt库
- 典型RSA加密三步:
- 创建加密对象
- 设置公钥
- 执行加密
3. 代码扒取与复现
-
模块化代码处理:
- 识别模块加载器(call()/apply()方法)
- 复制相关模块(本例中为模块3和模块4)
-
环境补全:
// Node.js环境下补全window对象 var window = global; // 浏览器环境补全 var navigator = { userAgent: 'Mozilla/5.0...' }; -
常见报错处理:
- "ASN1 is not defined":需确保JS解码器环境
- 在Node.js中应将
window = this改为window = global
三、案例二分析:minmetals.com.cn采购信息加密
1. 加密特征识别
- 加密参数param长度很长→RSA加密可能性大
- 搜索
setPublicKey快速定位加密代码
2. 加密流程解析
-
加密对象创建:
t = new v["a"](); t.setPublicKey(r); // r为公钥 -
参数构造:
a = m({ ...e, // 原始数据对象 sign: f(JSON.stringify(e), 32), // MD5签名 timeStamp: +new Date() // 时间戳 }); -
长文本加密:
s = t.encryptLong(JSON.stringify(a));
3. 关键组件分析
-
MD5签名:
f(JSON.stringify(e), 32)生成32位签名- 可通过在线MD5工具验证
-
时间戳:
+new Date()获取当前时间戳
-
公钥获取:
- 在Console中直接输出
r变量获取
- 在Console中直接输出
4. Webpack模块处理
-
识别模块加载器:
v = gb("9816"); // 9816是模块ID -
模块依赖分析:
- 9816模块依赖a524模块
- 需要完整复制所有依赖模块代码
-
方法补全顺序:
- 先补全
m方法 - 然后补全
m依赖的d和b方法 - 最后补全
encryptLong及其依赖的w方法
- 先补全
四、完整复现流程
1. 环境搭建
// Node.js环境设置
var window = global;
var navigator = { userAgent: 'Mozilla/5.0...' };
// 加载器设置
var gb;
(function(A){...})({
// 所有依赖模块
a524: function(e) {...},
9816: function(e, t, n) {...}
});
2. 加密函数实现
function getParam() {
// 1. 准备原始数据
e = {
"inviteMethod": "",
"businessClassfication": "",
"mc": "",
"lx": "ZBGG",
"dwmc": "",
"pageIndex": 1
};
// 2. 设置公钥
r = '-----BEGIN PUBLIC KEY-----\n...';
// 3. MD5签名方法
function f(string, bit) {...}
// 4. 辅助方法
function b(A, e, t) {...}
function w(A) {...}
function d(A, e) {...}
// 5. 参数构造方法
function m(A) {
return {
...A,
sign: f(JSON.stringify(A), 32),
timeStamp: +new Date()
};
}
// 6. 执行加密
v = gb("9816");
t = new v["a"]();
v["a"].prototype.encryptLong = function(A) {...};
t.setPublicKey(r);
a = m(m({}, e));
s = t.encryptLong(JSON.stringify(a));
return s;
}
3. 执行验证
a = getParam();
console.log(a);
五、关键技巧总结
-
快速定位技巧:
- 搜索关键词:
password,encrypt,setPublicKey - 观察网络请求中的加密参数特征
- 搜索关键词:
-
模块化代码处理:
- 识别加载器(通常包含call/apply)
- 按需复制依赖模块
- 注意模块ID类型(数字不加引号,字符串需加引号)
-
环境补全原则:
- 浏览器对象:window, navigator, document等
- Node.js环境特殊处理:
window = global
-
调试技巧:
- 在关键位置打debugger断点
- 使用Console输出中间变量值
- 对比在线加密工具验证加密结果
-
加密方法识别:
- 通过密文长度初步判断
- 观察是否有设置公钥/私钥的操作
- 注意是否有初始化向量(IV)等特征
通过以上详细分析和步骤拆解,可以系统性地掌握JS逆向中RSA加密的分析方法和复现技巧。实际应用中需根据具体网站情况灵活调整策略。