ASAR完整性
ASAR 完整性是一种安全特性,其会在运行时验证你应用的 ASAR 归档文件的内容。
版本支持
目前,以下版本支持 ASAR 完整性检查:
- 对于 macOS:
electron>=16.0.0 - 对于 Windows:
electron>=30.0.0
ASAR 完整性在 Mac 应用商店(MAS)构建版本里得到完全支持并被推荐为最佳实践。 虽然通过应用商店安装的应用程序的 Resources/ 文件夹已经受到系统保护(拥有者为 root),但是 ASAR 完整性还会在此之上提供额外一层安全层。 如果你使用 Electron 的 MAS 构建版本,但是通过 Mac 应用商店以外的渠道分发应用(比如直接下载),这一特性就会显得尤其重要,因为以这种方式安装的应用不会有系统级的只读保护。
为了启用 ASAR 完整性检查,你还需要确保 app.asar 文件是由支持 ASAR 完整性的 @electron/asar npm 包生成的。
该特性在 asar@3.1.0 中得到支持。 需注意该 npm 包已经迁移到 @electron/asar。 @electron/asar 的所有版本都支持 ASAR 完整性。
工作原理
每个 ASAR 归档文件都包含一个 JSON 字符串头部。 头部格式包含了一个 integrity 对象,里面包含了十六进制编码的整个归档文件的哈希值,以及由每个长度为 blockSize 字节的数据块的十六进制编码哈希值组成的数组。
{
"algorithm": "SHA256",
"hash": "...",
"blockSize": 1024,
"blocks": ["...", "..."]
}
另外,在打包你的 Electron 应用时,你需要定义整个 ASAR 头部的十六进制编码哈希值。
启用 ASAR 完整性后,您的 Electron 应用将在运行时验证 ASAR 归档文件的头部哈希。 如果没有提供哈希值或者哈希值不一致,应用将会被强制终止运行。
在二进制文件内启用 ASAR 完整性
Electron 目前默认禁用 ASAR 完整性检查,可以通过切换 EnableEmbeddedAsarIntegrityValidation Electron fuse 以在构建时启用它。
启用该 Fuse 时,你通常也想要启用 onlyLoadAppFromAsar Fuse。 否则可以通过 Electron 应用代码搜索路径绕过有效性验证。
const { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses')
flipFuses(
// E.g. /a/b/Foo.app
pathToPackagedApp,
{
version: FuseVersion.V1,
[FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true,
[FuseV1Options.OnlyLoadAppFromAsar]: true
}
)
使用 Electron Forge,你可以在 Forge 配置文件里使用 @electron-forge/plugin-fuses 配置你的应用的 Fuse。
提供头部哈希值
ASAR 完整性会用你打包时提供的头部哈希值验证 ASAR 归档文件的内容。 提供这个打包哈希值的过程在 macOS 和 Windows 上有所不同。
使用 Electron 工具
asar 启用后,Electron Forge 和 Electron Packager 会自动为你完成这一设置工作,无需额外配置。 ASAR 完整性的最低版本要求是:
@electron/packager@18.3.1@electron/forge@7.4.0
使用其他构建系统
macOS
在为 macOS 打包时,你必须要在打包应用的 Info.plist 中填充有效的 ElectronAsarIntegrity 字典块。 下面是一个例子。
<key>ElectronAsarIntegrity</key>
<dict>
<key>Resources/app.asar</key>
<dict>
<key>algorithm</key>
<string>SHA256</string>
<key>hash</key>
<string>9d1f61ea03c4bb62b4416387a521101b81151da0cfbe18c9f8c8b818c5cebfac</string>
</dict>
</dict>
有效的 algorithm 值当前是 SHA256。 hash 是用给定的算法计算得到的 ASAR 头部哈希值。 @electron/asar 包暴露了一个 getRawHeader 方法,计算其调用结果的哈希来生成此值(例如使用 node:crypto 模块)。
Windows
在为 Windows 打包时,你必须要填充一个有效的资源条目,类型为 Integrity,名称为 ElectronAsar。 该资源的值应该是一个 JSON 编码的字典 ,其形式如下:
[
{
"file": "resources\\app.asar",
"alg": "sha256",
"value": "9d1f61ea03c4bb62b4416387a521101b81151da0cfbe18c9f8c8b818c5cebfac"
}
]
关于实现示例,请参阅 Electron Packager 里的 src/resedit.ts 。