Electron app.asar 加密:原生模块与自动更新的正确处理方式
app.asar 本质是明文归档,改扩展名挡不住解包。这篇讲清楚加密到底改变了什么,以及 unpacked 原生模块、自动更新这两个最容易翻车的地方。
一、为什么只压缩 app.asar 没用
Electron 应用把前端代码和 Node 逻辑打成一个 app.asar,本质是个未加密的归档文件。市面上随便一个 asar 解包工具,一条命令就能把全部源码还原出来——这就是常说的「反编译」,几秒钟的事。
「改扩展名」「加个密码压缩包」这类做法也挡不住:Electron 运行时必须能读取 asar,任何人只要能让它跑起来,就能用同样的方式读出来。真正的门槛在于让载荷以密文形式存在,只有通过授权校验后才在内存中解密。
二、加密流程
- 上传:把
app.asar传到后台「文件加密」。系统按扩展名识别为 Electron 包,不会和普通 zip 混淆。 - 构建:服务端生成一次性随机密钥,把 asar 加密成载荷,再套上启动外壳,产出可分发的包。
- 下载:下载的是完整可分发的产物,替换原来的应用目录即可。
- 授权:首次运行显示机器码,后台批准或客户用卡密自助绑定,之后正常启动。
三、原生模块与 unpacked 目录
带原生模块(.node)的 Electron 应用,打包时通常会把模块放到 app.asar.unpacked/。这类目录有两个特点:
- 里面的文件必须保持独立文件形态,Node 才能
require到; - 符号链接和可执行位在跨平台打包时容易丢失,导致换机器后启动失败。
所以加密时要区分处理:主体 JS 走密文载荷,unpacked 里的原生模块单独保留并修复权限与符号链接。如果产物启动时报 Cannot find module,先检查 unpacked 目录是否完整,而不是怀疑加密本身。
四、自动更新要注意什么
- 更新包同样要加密:只加密主程序、更新包放明文,等于把源码从后门送出去。
- 版本号要单调递增:外壳读取的版本号要和更新服务器上的一致,否则会反复提示更新。
- 更新后授权不丢:授权绑定的是机器码,不是文件哈希,正常更新不会让客户重新激活。如果出现更新后要求重新激活,通常是更新过程覆盖了配置文件。
五、常见问题
加密后启动变慢了吗?
会有一次解密开销,通常在几百毫秒量级,之后进入正常启动流程。如果明显变慢,多半是载荷体积过大或 unpacked 目录被整体塞进了密文。
支持 macOS 的 .app 吗?
高级会员与永久买断支持 .app 应用包(macOS 目录形态),打包时会保留符号链接与可执行权限。签名与公证(notarization)需自行处理,且应在加壳之后进行。
asar 和 zip 有什么区别?
asar 是 Electron 专用归档,有固定的目录结构约定;zip 是通用压缩包。平台按扩展名分别处理,不要把 asar 改名为 zip 上传,会导致结构识别错误。
能只加密其中几个 js 文件吗?
当前是按整个包加密,不支持细粒度挑文件。如果只想保护部分逻辑,建议把敏感逻辑抽到独立模块再整体打包。
注册即开独立授权后台
免费体验 12 小时,无需绑定支付方式,可加密文件、发卡密、撤销授权。