Electron 打包可以通过 代码混淆、ASAR 防解压、V8 字节码、ASAR 加密、完整性校验 五层方案加密,大幅提高逆向难度(但无法 100% 绝对防破解)。
一、基础:代码混淆(必做)
用 javascript-obfuscator 打乱 JS 代码(主进程 / 渲染进程 /preload 都适用):
npm install javascript-obfuscator --save-dev
配置(obfuscator.config.js)
module.exports = {
compact: true,
controlFlowFlattening: true, // 控制流扁平化
controlFlowFlatteningThreshold: 0.75,
stringArray: true, // 字符串加密
stringArrayEncoding: ['base64'],
stringArrayThreshold: 0.9,
identifierNamesGenerator: 'hexadecimal', // 变量名变16进制
disableConsoleOutput: true // 禁用console
}
打包时自动混淆(配合 electron-builder):
// vue.config.js / webpack.config.js
const WebpackObfuscator = require('webpack-obfuscator')
module.exports = {
configureWebpack: {
plugins: [ new WebpackObfuscator(require('./obfuscator.config.js')) ]
}
}
二、进阶:ASAR 防解压(阻止直接解包)
用 asarmor 破坏 app.asar 结构,让 asar extract 失败:
npm install asarmor --save-dev
electron-builder 钩子(afterPack.js)
const { Asarmor, Trashify } = require('asarmor')
const path = require('path')
exports.default = async ({ appOutDir, packager }) => {
const asarPath = path.join(packager.getResourcesDir(appOutDir), 'app.asar')
const asarmor = new Asarmor(asarPath) // 注入垃圾数据 + 破坏结构
asarmor.applyProtection(new Trashify(['.git', '.env']))
asarmor.patch() // 偏移篡改
await asarmor.write(asarPath)
}
package.json
"build": { "afterPack": "./afterPack.js" }
三、高级:V8 字节码(最安全,无法反编译)
将 JS 编译为 Node/V8 字节码(.jsc),无原始 JS 代码:
方案 A:bytenode(主进程)
npm install bytenode --save
编译脚本
const bytenode = require('bytenode')
bytenode.compileFile({
filename: 'main.js',
output: 'main.jsc',
compileAsModule: true
})
入口加载
// main.js(仅入口,不加密)
require('bytenode')
require('./main.jsc')
方案 B:electron-vite 内置字节码(推荐)
// electron.vite.config.ts
export default defineConfig({
main: {
build: {
bytecode: {
enable: true,
protectedStrings: ['API_KEY', 'TOKEN'] // 敏感字符串加密
}
}
}
})
四、企业级:ASAR 整体加密(运行时解密)
自定义加密(AES):打包时加密 app.asar,启动时内存解密:
- 打包阶段:用 AES 加密 app.asar → app.asar.enc
- 启动阶段:主进程加载自定义解密器,内存解密后加载
- 配合 ASAR Integrity 防篡改
五、最终加固组合(推荐)
JS 混淆 → 2. V8 字节码(主进程)→ 3. asarmor 防解压 → 4. 代码签名 → 5. ASAR 完整性校验
六、重要提醒
- 没有绝对安全:客户端代码总有被逆向可能,核心逻辑放后端最稳妥
- 兼容性:字节码必须与 Electron 内置 Node/V8 版本完全一致
- 性能:混淆 / 字节码会轻微增加体积与启动时间