混淆后的JavaScript代码怎么还是能被反编译还原?
我在项目里用terser做了代码混淆,但用在线反编译工具居然能轻松还原核心函数逻辑。比如这个加密函数:
function encryptData(data) {
const key = 'secret123';
return btoa(data + key).replace(/=/g, '');
}
混淆后变成这样:function _(_){return btoa(_+"secret123").replace(/=/g,"")},但通过JSBeautifier整理后结构完全清晰。试过增加mangle.depth到3,但变量名还是能猜到用途。有没有更彻底的混淆方案?或者需要配合其他防护手段?
第一种方案是用 WebAssembly。把核心逻辑用 C 或 Rust 写好,编译成 WASM 模块,然后在 JavaScript 里加载调用。反编译 WASM 的成本比看混淆后的 JS 高太多了。比如你的加密函数,可以改成这样:
第二种方案是服务端计算。如果这个加密逻辑真的不能泄露,那就干脆放到后端去执行,前端通过接口调用。这样代码完全不在客户端暴露。比如你可以搭个简单的 API:
如果你非要继续用 JavaScript 并且想增强混淆效果,那建议配合动态加载和运行时生成代码。比如把关键逻辑拆分成字符串,运行时 eval 或 new Function 动态执行。但这种方式对性能有影响,而且现代浏览器可能会警告或限制 eval 的使用。
最后提醒一句,前端防护永远是防君子不防小人。真正重要的逻辑一定要放后端,别想着在前端做到滴水不漏。