混淆后的JavaScript代码怎么还是能被反编译还原?

UI世杰 阅读 10

我在项目里用terser做了代码混淆,但用在线反编译工具居然能轻松还原核心函数逻辑。比如这个加密函数:


function encryptData(data) {
  const key = 'secret123';
  return btoa(data + key).replace(/=/g, '');
}

混淆后变成这样:function _(_){return btoa(_+"secret123").replace(/=/g,"")},但通过JSBeautifier整理后结构完全清晰。试过增加mangle.depth到3,但变量名还是能猜到用途。有没有更彻底的混淆方案?或者需要配合其他防护手段?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
莉娟
莉娟 Lv1
混淆本来就是为了增加阅读难度,不是为了加密。你想要彻底防护代码逻辑,光靠混淆是不够的,得上点硬手段。

第一种方案是用 WebAssembly。把核心逻辑用 C 或 Rust 写好,编译成 WASM 模块,然后在 JavaScript 里加载调用。反编译 WASM 的成本比看混淆后的 JS 高太多了。比如你的加密函数,可以改成这样:

// 假设你已经编译好了一个 WASM 模块
const wasmModule = await WebAssembly.instantiateStreaming(fetch('encrypt.wasm'));
const { encryptData } = wasmModule.instance.exports;

// 调用时直接传入数据
const result = encryptData('inputData');


第二种方案是服务端计算。如果这个加密逻辑真的不能泄露,那就干脆放到后端去执行,前端通过接口调用。这样代码完全不在客户端暴露。比如你可以搭个简单的 API:

// 后端(Node.js 示例)
app.post('/encrypt', (req, res) => {
const data = req.body.data;
const key = 'secret123';
const encrypted = Buffer.from(data + key).toString('base64').replace(/=/g, '');
res.json({ result: encrypted });
});

// 前端调用
fetch('/encrypt', {
method: 'POST',
body: JSON.stringify({ data: 'inputData' }),
headers: { 'Content-Type': 'application/json' }
}).then(res => res.json()).then(data => console.log(data.result));


如果你非要继续用 JavaScript 并且想增强混淆效果,那建议配合动态加载和运行时生成代码。比如把关键逻辑拆分成字符串,运行时 eval 或 new Function 动态执行。但这种方式对性能有影响,而且现代浏览器可能会警告或限制 eval 的使用。

最后提醒一句,前端防护永远是防君子不防小人。真正重要的逻辑一定要放后端,别想着在前端做到滴水不漏。
点赞 2
2026-02-14 14:02