Windows 11 下用 npm 装 crypto-js 踩过的那些坑,以及如何用它逆向分析一个网站的登录加密
Windows 11 下逆向分析网站登录加密的完整实战指南最近在研究一个网站的登录流程时发现它在提交密码前会先进行加密处理。作为一名对前端安全感兴趣的开发者我决定深入探索这个加密过程并在本地环境中复现它。本文将分享我在 Windows 11 环境下使用 Node.js 和 crypto-js 库进行逆向分析的完整过程包括环境配置、加密算法识别和本地复现的详细步骤。1. 环境准备与 Node.js 配置逆向分析的第一步是搭建合适的工作环境。在 Windows 11 上我们需要安装 Node.js 和 npm这是后续所有工作的基础。1.1 Node.js 安装与验证从 Node.js 官网下载最新的 LTS 版本目前是 18.x。安装时需要注意几个关键点建议自定义安装路径比如D:\DevTools\nodejs避免使用包含空格或特殊字符的路径安装时勾选 Automatically install the necessary tools 选项这会包括 npm 和核心模块安装完成后验证是否成功node -v npm -v如果看到版本号输出说明安装成功。我最初遇到的问题是环境变量没有自动配置导致命令行无法识别 node 命令。解决方法是在系统环境变量的 Path 中添加 Node.js 的安装路径。1.2 npm 配置优化npm 默认配置有几个需要调整的地方修改全局模块安装路径npm config set prefix D:\DevTools\nodejs\node_global npm config set cache D:\DevTools\nodejs\node_cache更换为国内镜像源显著提升安装速度npm config set registry https://registry.npmmirror.com/注意淘宝源已更换新域名旧域名(taobao.org)将停止服务常见问题排查权限不足右键 Node.js 安装目录 → 属性 → 安全 → 编辑 → 赋予完全控制权限缓存问题执行npm cache clean --force后重试网络问题临时关闭防火墙或杀毒软件测试2. crypto-js 的安装与核心概念crypto-js 是一个强大的 JavaScript 加密库支持多种哈希算法和对称加密。在逆向分析中我们主要关注它的 AES 实现。2.1 安装与导入全局安装 crypto-jsnpm install crypto-js在项目中引入特定模块// ES6 方式 import AES from crypto-js/aes import enc from crypto-js/enc-utf8 // CommonJS 方式 const CryptoJS require(crypto-js)2.2 关键加密参数理解AES 加密需要三个核心参数参数说明示例值Key加密密钥长度必须为16/24/32字节mySecretKey12345IV初始化向量增加加密随机性initializationVMode加密模式如 CBC、ECB 等CryptoJS.mode.CBCPadding填充方案如 Pkcs7CryptoJS.pad.Pkcs7在逆向网站加密时我们的首要任务就是找出这些参数的值。3. 浏览器逆向实战定位加密逻辑现在进入最有趣的部分 - 逆向分析目标网站的加密实现。以某电商网站登录为例。3.1 捕获加密请求打开 Chrome 开发者工具F12→ Network 标签勾选 Preserve log 防止页面跳转丢失记录在登录页面输入测试账号如 user/123456并提交筛选 XHR 请求找到登录接口通常包含 login/auth 等关键词观察请求负载发现 password 字段值为 A7428361DEF118911783F446A129FFCE明显是加密后的结果。3.2 定位加密代码在 Sources 面板中搜索关键词直接搜索 encrypt、AES、CryptoJS或者搜索密码明文 123456 看在哪里被处理找到类似如下的代码片段function encryptPassword(pwd) { const key CryptoJS.enc.Utf8.parse(2017110912453698); const iv CryptoJS.enc.Utf8.parse(2017110912453698); const encrypted CryptoJS.AES.encrypt(pwd, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString().toUpperCase(); }这就是我们要找的核心加密逻辑记下 key、iv、mode 和 padding 的值。3.3 提取加密参数从代码中可以提取出以下关键信息加密算法AES-CBC密钥(key)201711091245369816字节初始化向量(iv)与 key 相同填充方案PKCS7输出处理转为大写字符串安全提示实际逆向分析应仅用于学习目的避免未经授权分析商业网站4. 本地复现加密过程现在我们在本地 Node.js 环境中复现这个加密过程。4.1 创建加密工具类新建cryptoHelper.js文件const CryptoJS require(crypto-js) class CryptoHelper { constructor(key, iv) { this.key CryptoJS.enc.Utf8.parse(key) this.iv CryptoJS.enc.Utf8.parse(iv) } encrypt(plainText) { const srcs CryptoJS.enc.Utf8.parse(plainText) const encrypted CryptoJS.AES.encrypt(srcs, this.key, { iv: this.iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) return encrypted.ciphertext.toString().toUpperCase() } decrypt(cipherText) { const encryptedHexStr CryptoJS.enc.Hex.parse(cipherText) const srcs CryptoJS.enc.Base64.stringify(encryptedHexStr) const decrypt CryptoJS.AES.decrypt(srcs, this.key, { iv: this.iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) return decrypt.toString(CryptoJS.enc.Utf8) } } // 使用网站提取的参数初始化 const websiteCrypto new CryptoHelper( 2017110912453698, 2017110912453698 ) module.exports { websiteCrypto }4.2 测试加密效果创建测试文件test.jsconst { websiteCrypto } require(./cryptoHelper) // 测试加密 const plainPassword 123456 const encrypted websiteCrypto.encrypt(plainPassword) console.log(加密结果: ${encrypted}) // 测试解密 const decrypted websiteCrypto.decrypt(encrypted) console.log(解密结果: ${decrypted})运行后应该能看到输出加密结果: A7428361DEF118911783F446A129FFCE 解密结果: 123456这与我们在浏览器中观察到的行为完全一致说明复现成功4.3 处理特殊字符问题在实际应用中加密结果可能包含特殊字符如 /直接作为 URL 参数传输会有问题。需要额外处理function safeEncrypt(plainText) { const encrypted websiteCrypto.encrypt(plainText) return encodeURIComponent(encrypted) } // 使用示例 const safeEncrypted safeEncrypt(123456) console.log(safeEncrypted) // 输出URL安全的编码字符串5. 逆向工程中的高级技巧在更复杂的场景中你可能会遇到以下情况5.1 动态密钥生成有些网站会动态生成密钥通常通过以下方式从服务器接口获取基于时间戳或其他变量计算使用 RSA 加密传输 AES 密钥应对方法在开发者工具中搜索 getKey、initKey 等关键词跟踪网络请求寻找密钥相关的接口设置断点调试密钥生成逻辑5.2 混淆的加密代码现代前端常用代码混淆技术增加逆向难度。可以尝试使用浏览器格式化工具美化压缩代码{} 按钮搜索加密字符串特征如 AES、encrypt关注 CryptoJS 特有的方法调用链5.3 多阶段加密某些安全要求高的网站会采用多阶段加密先对原始密码做 MD5/SHA 哈希添加随机 salt 值再进行 AES 加密识别方法在密码输入后设置 DOM 断点跟踪密码变量的传递过程检查是否有多个加密函数调用6. 安全实践与法律考量在进行加密逆向分析时务必注意合法合规仅分析自己有权限测试的网站不要绕过付费墙或访问控制尊重用户隐私和数据保护法律安全建议在沙盒环境中测试避免影响生产系统不要存储或传播获取的敏感数据使用测试账号而非真实用户凭证防护措施// 示例检测运行环境 if (typeof window undefined) { console.log(运行在Node.js环境) } else { console.log(运行在浏览器环境) // 可以添加额外的防护逻辑 }在实际项目中如果发现安全漏洞建议通过正规渠道向网站管理员报告。