RSA.js 前端加密逆向实战:3步定位智慧江财登录密码加密逻辑
RSA.js 前端加密逆向实战3步定位智慧江财登录密码加密逻辑当你在浏览器中输入账号密码点击登录时那些看似简单的字符在传输前经历了怎样的蜕变以江西财经大学智慧校园系统为例其前端采用RSA非对称加密保护用户密码。本文将手把手带你用开发者工具解剖这套加密机制掌握一套可复用的前端加密逆向分析方法。1. 逆向分析前的准备工作逆向工程如同侦探破案需要先锁定案发现场。打开Chrome开发者工具Windows快捷键F12Mac快捷键OptionCommandI我们主要使用以下功能模块Network面板记录所有网络请求重点关注XHR和Doc类型Sources面板查看和调试网页加载的所有JavaScript文件Console面板实时执行JavaScript代码片段Elements面板查看DOM结构和表单元素首先访问智慧江财登录页清空Network记录后执行一次登录操作。在Network面板的Filter输入login快速定位到登录请求可以看到关键请求参数POST /cas/login HTTP/1.1 username2202140875password7a8f9b3...lt_c4EC..._eventIdsubmit关键观察点password参数值明显不是明文长度固定且为十六进制字符串存在lt等隐藏字段作为一次性令牌请求头包含Content-Type: application/x-www-form-urlencoded2. 三步定位加密核心逻辑2.1 全局搜索加密参数在Sources面板按下CtrlShiftF开启全局搜索输入password或encrypt等关键词。很快在某个js文件中发现可疑代码片段function checkInput(){ var pwd document.getElementById(password).value; var encPwd rsaEncrypt(pwd); document.getElementById(passwordEnc).value encPwd; return true; }这段代码揭示了加密流程获取明文密码输入调用rsaEncrypt函数加密将结果赋给隐藏表单字段passwordEnc2.2 追踪加密函数实现继续搜索rsaEncrypt函数定义定位到核心加密逻辑function rsaEncrypt(text) { var rsa new RSAKey(); rsa.setPublic( 5598e3b75d21a2989274e222fa59ab07d829faa29b544e3a920c4dd287aed9302a657280c23220a35ae985ba157400e0502ce8e44570a1513bf7146f372e9c842115fb1b86def80e2ecf9f8e7a586656d12b27529f487e55052e5c31d0836b2e8c01c011bca911d983b1541f20b7466c325b4e30b4a79652470e88135113c9d9, 10001 ); return rsa.encrypt(text); }关键参数说明nRSA模数Modulus十六进制大整数e公钥指数Exponent通常为655370x10001encrypt()执行实际加密操作2.3 验证加密结果在Console面板直接调用加密函数验证rsaEncrypt(test123) // 输出7a8f9b3d5e6c12a4f7...与Network中捕获的加密结果格式一致确认这就是目标加密函数。3. 深度解析RSA.js实现通过进一步分析发现系统使用了经典的RSA加密库组合文件功能依赖关系rsa.js核心RSA算法实现依赖jsbn.jsjsbn.js大整数运算库无依赖rng.js随机数生成器依赖prng4.jsprng4.js伪随机数生成器实现无依赖加密调用链如下RSAKey()构造函数初始化密钥对象setPublic(n, e)设置公钥参数encrypt(text)执行PKCS#1 v1.5填充和模幂运算典型加密流程代码// 初始化RSA实例 const rsa new RSAKey(); // 设置公钥实际项目这些参数可能需要动态获取 rsa.setPublic( 5598e3b75d21a2989274e222fa59ab07d829faa29b544e3a920c4dd287aed9302a657280c23220a35ae985ba157400e0502ce8e44570a1513bf7146f372e9c842115fb1b86def80e2ecf9f8e7a586656d12b27529f487e55052e5c31d0836b2e8c01c011bca911d983b1541f20b7466c325b4e30b4a79652470e88135113c9d9, 10001 ); // 加密密码 const encrypted rsa.encrypt(myPassword123); console.log(encrypted); // 输出加密结果4. 动态参数处理实战技巧在实际逆向过程中经常会遇到参数动态变化的情况。以下是几种常见场景的应对策略4.1 公钥参数动态获取有时n/e参数会通过接口返回或写在页面元素中。可通过以下方式提取// 从页面元素获取 const n document.querySelector(#rsaN).value; const e document.querySelector(#rsaE).value; // 从接口响应获取需Hook XMLHttpRequest或Fetch API const originalOpen XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open function() { this.addEventListener(load, function(){ if(this.responseURL.includes(getRSAKey)) { const data JSON.parse(this.responseText); console.log(获取到RSA参数, data.n, data.e); } }); return originalOpen.apply(this, arguments); };4.2 加密函数Hook技巧当加密函数被混淆或难以定位时可以Hook关键函数// 保存原始函数 const originalEncrypt window.rsaEncrypt; // 重写函数 window.rsaEncrypt function(text) { console.log(加密原文, text); const result originalEncrypt(text); console.log(加密结果, result); return result; };4.3 自动化脚本示例结合上述分析可以编写自动登录脚本Node.js示例const { RSAKey } require(./rsa); const axios require(axios); async function login(username, password) { // 第一步获取登录页动态参数 const { data } await axios.get(https://ssl.jxufe.edu.cn/cas/login); const lt parseLT(data); // 从HTML中提取lt参数 // 第二步RSA加密密码 const rsa new RSAKey(); rsa.setPublic( 5598e3b75d21a2989274e222fa59ab07d829faa29b544e3a920c4dd287aed9302a657280c23220a35ae985ba157400e0502ce8e44570a1513bf7146f372e9c842115fb1b86def80e2ecf9f8e7a586656d12b27529f487e55052e5c31d0836b2e8c01c011bca911d983b1541f20b7466c325b4e30b4a79652470e88135113c9d9, 10001 ); const encPassword rsa.encrypt(password); // 第三步提交登录 const params new URLSearchParams(); params.append(username, username); params.append(password, encPassword); params.append(lt, lt); params.append(_eventId, submit); const response await axios.post(https://ssl.jxufe.edu.cn/cas/login, params); console.log(登录结果, response.data); } function parseLT(html) { // 实现从HTML中提取lt参数的逻辑 return html.match(/namelt value([^])/)[1]; }逆向分析前端加密就像解谜游戏关键在于找到正确的线索入口。通过本文介绍的三步法——抓包定位、全局搜索、参数追踪配合开发者工具的灵活使用可以系统性地破解大多数网站的前端加密逻辑。