)
目录前端JS数据加密核心疑问操作非加密流程修改位置前端加密流程修改位置关键核心结论CryptoJSMD5/AES/DES/HMAC前端加密安全漏洞漏洞 1对称加密AES/DES密钥硬编码在 JS攻击者直接提取密钥解密 / 伪造密文攻击流程漏洞 2MD5/SHA1 仅做加密无随机盐、无请求签名可碰撞 / 批量伪造风险漏洞 3HMAC 使用固定密钥前端泄露密钥后可伪造任意签名风险漏洞 4前端加密仅防窃听后端缺失二次业务校验最普遍高危漏洞漏洞 5DES 弱加密算法安全性极低jsencrypt RSA 非对称前端加密安全漏洞漏洞 1仅加密业务参数未做请求签名依然可篡改参数逻辑攻击方式漏洞 2RSA 单次加密长度有限分段加密易被篡改、拆分绕过漏洞 3依赖前端生成随机向量 / 随机数随机因子可控可预测漏洞 4后端无会话绑定校验加密数据可复用重放攻击漏洞 5公钥可替换中间人攻击无证书校验JS 代码混淆的安全局限性与安全问题1. 混淆只能提升逆向成本无法防止逆向解密加密逻辑漏洞2. 混淆无法拦截抓包篡改请求3. 混淆存在调试防护绕过绕过手段4. 压缩混淆会掩盖恶意后门 / 隐藏漏洞5. 混淆不改变前端不可信核心问题攻击手段统一总结三大类技术核心安全缺陷1. 前端对称加密CryptoJS AES/DES/MD5/HMAC致命短板2. 前端 RSA 非对称加密jsencrypt短板3. JS 代码混淆的本质局限修复方案前端JS数据加密核心疑问操作安全测试修改数据包发生在哪一步非加密流程修改位置流程客户端明文 → 网络传输明文 → 服务端接收修改点网络传输阶段抓包工具 Burp/Charles/Fiddler 拦截请求JS 只是把明文直接放进请求体 / 参数发送中间人拦截 HTTP 请求直接篡改明文参数再转发给后端。示例前端直接提交金额money100抓包改成money0.01提交后端无校验直接生效。前端加密流程修改位置关键流程明文前端 JS 加密 → 传输密文 → 后端解密处理两种修改场景场景 1篡改密文无签名校验后端仅解密不校验原始数据合法性修改阶段网络传输阶段拦截直接替换密文字符串发包。 后端解密后拿到篡改数据业务沦陷。场景 2逆向前端加密逻辑构造合法密文最常用渗透手段修改阶段客户端 JS 加密之前安全测试人员 F12 拿到 CryptoJS/jsencrypt 加密源码、密钥、盐值本地逆向复现加密算法手动构造恶意明文 → 加密生成合法密文再发包 后端无法区分是正常页面加密还是黑客手动构造的密文。核心结论前端加密不能防止抓包篡改只能防止传输明文窃听无法抵御中间人篡改攻击。CryptoJSMD5/AES/DES/HMAC前端加密安全漏洞漏洞 1对称加密AES/DES密钥硬编码在 JS攻击者直接提取密钥解密 / 伪造密文// 前端危险代码AES 加密密钥写死在前端 script srccrypto-js.min.js/script script // 密钥明文硬编码在JS任何人F12可见 const KEY CryptoJS.enc.Utf8.parse(1234567890123456); const IV CryptoJS.enc.Utf8.parse(1234567890123456); function encrypt(text){ return CryptoJS.AES.encrypt(text, KEY, {iv:IV}).toString(); } function decrypt(cipher){ return CryptoJS.AES.decrypt(cipher, KEY, {iv:IV}).toString(CryptoJS.enc.Utf8); } // 提交订单金额加密 let money document.getElementById(money).value; let cipherText encrypt(money); // AJAX发送密文给后端 $.post(/pay, {data:cipherText}) /script攻击流程1、F12 查看源码拿到KEY12345678901234562、本地调用同一套加密函数构造恶意金额money0.013、生成合法密文Burp 拦截替换请求里的data参数提交4、后端用相同密钥解密收到篡改金额直接扣款。漏洞 2MD5/SHA1 仅做加密无随机盐、无请求签名可碰撞 / 批量伪造// 错误用法仅对参数 MD5 加密后端只解密不校验完整性 // 前端对订单ID简单MD5 function getMd5(id){ return CryptoJS.MD5(id).toString(); } let orderId 10001; let sign getMd5(orderId); $.post(/api/order, {orderSign:sign})风险MD5 不可逆但可枚举彩虹表攻击者遍历订单 ID 批量生成签名遍历查询所有用户订单 若后端仅校验 “字符串是合法 MD5”不绑定会话 / 随机盐完全失去防护意义。漏洞 3HMAC 使用固定密钥前端泄露密钥后可伪造任意签名// HMAC 设计本意是做数据完整性校验但密钥放前端直接失效 const hmacKey mysecret123; function getHmac(data){ return CryptoJS.HmacSHA256(data, hmacKey).toString(); } // 请求参数 hmac签名一起发送 let data money100; let sign getHmac(data); $.post(/pay, {data, sign})风险攻击者提取hmacKey自行构造datamoney0.01并生成合法 sign后端无法分辨数据被篡改。漏洞 4前端加密仅防窃听后端缺失二次业务校验最普遍高危漏洞哪怕加密算法无漏洞只要后端不校验业务逻辑篡改密文后依然能越权前端加密用户 IDuserId1001加密传输攻击者逆向加密逻辑生成userId1002密文发包后端解密拿到 1002直接返回他人订单数据 →水平越权。漏洞 5DES 弱加密算法安全性极低DES 密钥短56 位可暴力破解前端使用 DES 极易被快速破解密文。jsencrypt RSA 非对称前端加密安全漏洞RSA 逻辑公钥放前端加密私钥保存在后端解密。漏洞 1仅加密业务参数未做请求签名依然可篡改参数逻辑// 错误示例只加密金额请求其他参数明文传输 script srcjsencrypt.js/script script // 公钥公开写在前端 const publicKey -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3 6rPJjCvfSC82qYuJHj7khFcnX5QAN4hK03sIfxBVDvQZvODA/vwf44r1BHfr MzdrO7blaKEAAQekKsYzkElRWwH0vsyjEZqy9WRUvVrZ5kSTnHxHvz3o/WGObAEV 5rypMxb9q4vM14qFevzhtXeoQIDAQAB -----END PUBLIC KEY-----; let encrypt new JSEncrypt(); encrypt.setPublicKey(publicKey); let money $(#money).val(); let cipherMoney encrypt.encrypt(money); // userId明文传输仅money加密 $.post(/pay, {userId:1001, money:cipherMoney}) /script攻击方式Burp 抓包修改明文userId:1002加密金额不变后端解密金额正常同时读取篡改后的用户 ID操作他人账户。漏洞 2RSA 单次加密长度有限分段加密易被篡改、拆分绕过jsencrypt RSA 加密有明文长度上限开发会拆分长文本分段加密攻击者可修改其中一段数据后端拼接后逻辑错乱。漏洞 3依赖前端生成随机向量 / 随机数随机因子可控可预测若前端自行生成加密随机因子用于签名攻击者复现随机规则批量伪造合法请求。漏洞 4后端无会话绑定校验加密数据可复用重放攻击攻击者抓一次合法加密请求反复重复发包重复扣款、重复提交表单仅靠 RSA 加密无法防御重放必须增加时间戳、一次性 nonce 随机数做签名校验。漏洞 5公钥可替换中间人攻击无证书校验如果网站没有 HTTPS中间人劫持页面替换前端公钥为黑客私钥对应的公钥前端加密的数据黑客可解密窃取再用真实公钥加密转发给服务器全程窃听篡改。JS 代码混淆的安全局限性与安全问题JS代码混淆为保护前端JS代码不被轻易逆向但是也会产生安全问题1. 混淆只能提升逆向成本无法防止逆向解密加密逻辑混淆本质只是修改变量名、压缩代码、增加无效僵尸代码算法逻辑完全保留。原始清晰代码function getAesCipher(text){ let key admin123456; return CryptoJS.AES.encrypt(text, key).toString(); }混淆后代码示例var _0x123a[admin123456,encrypt,toString];function _0x45b(_0xc1){let _0x22_0x123a[0];return CryptoJS.AES[_0x123a[1]](_0xc1,_0x22)[_0x123a[2]]()}漏洞1、使用反混淆工具js-beautify、在线解混淆网站一键格式化还原代码2、正则匹配CryptoJS.AES.encrypt、JSEncrypt关键字快速定位加密密钥与算法3、密钥、加密逻辑依然完整暴露混淆不能保护前端密钥。2. 混淆无法拦截抓包篡改请求混淆只是修改 JS 代码可读性网络传输的密文 / 请求参数完全不受影响Burp 依然可以拦截、替换请求数据混淆对中间人攻击完全无效。3. 混淆存在调试防护绕过市面上混淆工具常用 debugger 无限循环阻止开发者调试控制台setInterval(function(){debugger;},100);绕过手段浏览器控制台勾选「禁用调试器」直接跳过防护正常断点分析加密逻辑。4. 压缩混淆会掩盖恶意后门 / 隐藏漏洞业务 JS 混淆后隐藏高危逻辑硬编码密钥、后门接口难以快速审计恶意攻击者可植入僵尸函数、隐藏窃取 Cookie 代码审计人员难以快速识别风险。5. 混淆不改变前端不可信核心问题攻击手段无论混淆多复杂JS 运行在用户浏览器攻击者拥有完整控制权1、控制台覆盖加密函数直接输出明文// 控制台执行覆盖原有加密函数直接拿到原始明文 function _0x45b(text){ console.log(原始明文,text); // 打印要加密的原始数据 return 原来的加密结果; }2、删除、重写加密逻辑自定义恶意密文提交。统一总结三大类技术核心安全缺陷1. 前端对称加密CryptoJS AES/DES/MD5/HMAC致命短板1、密钥必须存放前端攻击者 100% 可提取2、仅加密传输内容无数据完整性校验中间人可篡改3、无法防御重放、越权、业务逻辑绕过4、仅能解决 HTTP 明文窃听不能做权限 / 数据防篡改防护。2. 前端 RSA 非对称加密jsencrypt短板1、仅加密参数无法保护整个请求明文参数易被篡改2、无时间戳 / 随机数防护存在重放攻击3、HTTP 环境下存在公钥劫持中间人风险4、长文本分段加密存在篡改漏洞。3. JS 代码混淆的本质局限1、仅增加逆向时间成本不能阻止逆向2、无法保护密钥、加密算法3、无法防御抓包篡改请求4、调试防护可一键绕过。修复方案1、区分加密作用前端加密仅用于防止传输窃听防篡改、权限校验必须放在后端2、数据完整性防护后端使用后端私钥生成全局签名包含全部参数 时间戳 会话 ID 随机 nonce前端仅传参签名由后端计算校验3、密钥管理对称密钥、RSA 私钥绝不前端存放敏感参数加密、签名计算全部后端完成4、业务双重校验解密后后端二次校验用户身份、金额、权限不能只依赖前端传入数据5、防重放请求携带时间戳 一次性随机数后端校验有效期拒绝重复请求6、HTTPS 强制部署杜绝中间人劫持替换公钥7、混淆仅作辅助不能作为安全防护手段核心加密逻辑移至后端接口处理。