Skip to content

ASAR 是归档格式,不是加密边界

Electron 常把应用 JavaScript、HTML 和依赖放进 app.asar。它减少零散文件,便于分发,并让 Electron 的部分文件 API 以接近普通目录的方式读取归档内容。归档中的代码仍然可以被列出和提取,因此 ASAR 不承担保密职责。

透明读取与真实文件操作

DeskLab 的实际产物中,asar list 能看到 main.jspreload.jsindex.htmlpackage.jsonnode_modules 和测试夹具。Electron 运行时成功读取:

text
app.asar/package.json
name=desklab-electron-startup-evidence
version=0.1.0

同一归档上的写入和切换工作目录均失败:

text
write app.asar/write-test.txt -> ENOTDIR
process.chdir(app.asar)       -> ENOTDIR

这反映了两种边界:Electron 对部分读操作提供归档感知,操作系统仍把 ASAR 视为一个文件。写入、chdir、动态库加载、外部程序调用等要求真实路径的操作不能依赖透明读取。

asarUnpack 只解包必要文件

原生 .node 模块、需要被系统工具直接打开的可执行文件,以及必须由第三方库按真实路径访问的资源,通常进入 app.asar.unpacked

js
module.exports = {
  packagerConfig: {
    asar: {
      unpack: '**/*.{node,dylib,so,dll}',
    },
  },
}

规则过宽会让大量源码和资源暴露在普通目录中,也会增大更新差异;规则过窄则常在开发环境正常、打包后报 ENOENTERR_DLOPEN_FAILED。应从具体运行时需求反推匹配范围,并在打包产物上跑测试。

Fuse 改变运行时能力

DeskLab 测试产物读取到的 Fuse 状态包括:

Fuse状态
EnableEmbeddedAsarIntegrityValidationDisabled
OnlyLoadAppFromAsarDisabled
RunAsNodeEnabled
EnableNodeOptionsEnvironmentVariableEnabled
EnableNodeCliInspectArgumentsEnabled

这是一份开发态结果,不代表生产配置。生产流水线可以按需求关闭调试入口,并启用 ASAR 完整性相关能力。Fuse 是 Electron 二进制中的构建期开关,修改后必须重新签名并重新验证启动、崩溃上报和更新流程。

完整性来自多层组合

ASAR 负责归档;Integrity 检查归档是否符合构建时记录;代码签名绑定发布者身份并检测签名覆盖范围内的变化;平台公证或信誉服务影响系统是否放行。任何一层都不等于代码加密,也不能单独代替另外几层。

验证生产产物时,至少保留 ASAR 文件清单、app.asar.unpacked 清单、Fuse 读取结果、平台签名结果和冷启动日志。这样才能判断故障是路径问题、归档完整性问题还是平台信任问题。

别急,先让缓存热一下。