Electron应用构建后如何保护app.asar文件?
解决Electron app.asar被提取/修改的免费简单方案
针对你Windows平台Electron应用的asar安全问题,以下是几个无需复杂签名、免费且易实现的方案:
方案一:自定义ASAR加密+启动时解密验证
这个方案直接对asar文件做对称加密,启动时在内存中解密后加载,避免明文被直接提取:
- 编写加密脚本:用Node.js的
crypto模块实现AES对称加密,示例代码:const fs = require('fs'); const crypto = require('crypto'); const key = Buffer.from('自定义32位密钥字符串', 'utf8'); const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); const input = fs.readFileSync('./app.asar'); const encrypted = Buffer.concat([cipher.update(input), cipher.final()]); fs.writeFileSync('./encrypted.asar', Buffer.concat([iv, encrypted])); - 修改主进程启动逻辑:在main.js最开头添加解密代码,读取加密后的asar,尽量在内存中完成解密后通过
app.setAppPath加载,避免明文写入磁盘 - 混淆密钥:不要把密钥直接写死在代码里,可以拆分字符串拼接、或从应用资源片段中组合生成,降低密钥被逆向获取的风险
方案二:自定义ASAR哈希校验(防修改)
如果主要需求是防止asar被篡改,而非完全阻止提取,可以实现启动时的哈希校验:
- 提前计算app.asar的SHA256哈希值:用命令行
openssl dgst -sha256 app.asar得到哈希字符串 - 在main.js中硬编码哈希值(可简单混淆,比如拆分成数组再拼接),启动时读取asar文件计算哈希对比:
const fs = require('fs'); const crypto = require('crypto'); const { app } = require('electron'); // 混淆后的预期哈希值 const expectedHashParts = ['a1b2', 'c3d4', 'e5f6']; const expectedHash = expectedHashParts.join(''); const fileBuffer = fs.readFileSync(`${process.resourcesPath}/app.asar`); const hash = crypto.createHash('sha256').update(fileBuffer).digest('hex'); if (hash !== expectedHash) { console.error('ASAR文件已被篡改'); app.quit(); } - 每次重新打包后要更新代码中的哈希值,确保和最终生成的asar文件匹配
方案三:核心逻辑迁移至原生Node.js Addon
把敏感的核心代码(比如数据记录、权限校验)用C/C++编写成Node.js原生模块,编译成.node二进制文件:
- 用N-API编写简单的原生模块,实现数据存储、校验等核心方法,通过node-gyp编译得到
.node文件 - 在main.js中
require这个原生模块,调用其方法完成敏感操作 - 打包时将
.node文件和asar一起打包,即使asar被提取,核心逻辑在二进制模块中,逆向难度远高于JS代码
方案对比
- 方案一:能同时防提取和修改,但解密过程存在内存明文风险,适合对代码保密性要求较高的场景
- 方案二:仅防修改,无法阻止提取,但实现最简单,适合主要担心文件被篡改的场景
- 方案三:保护核心逻辑,即使asar被提取,关键功能也无法被篡改或分析,适合敏感操作较多的应用
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

