ASAR 完整性
ASAR 完整性是一项实验性功能,可在运行时验证您应用程序的 ASAR 归档 内容。
版本支持
目前,ASAR 完整性检查支持
- macOS 上的
electron>=16.0.0
- Windows 上的
electron>=30.0.0
要启用 ASAR 完整性检查,您还需要确保您的 app.asar
文件是由支持 ASAR 完整性的 @electron/asar
npm 包版本生成的。
支持是在 asar@3.1.0
中引入的。请注意,该包此后已迁移到 @electron/asar
。所有版本的 @electron/asar
都支持 ASAR 完整性。
工作原理
每个 ASAR 归档都包含一个 JSON 字符串头部。头部格式包含一个 integrity
对象,该对象包含整个归档的十六进制编码哈希,以及每个 blockSize
字节块的十六进制编码哈希数组。
{
"algorithm": "SHA256",
"hash": "...",
"blockSize": 1024,
"blocks": ["...", "..."]
}
另外,您需要在打包 Electron 应用程序时定义整个 ASAR 头部的一个十六进制编码哈希。
当启用 ASAR 完整性时,您的 Electron 应用程序将在运行时验证 ASAR 归档的头部哈希。如果没有哈希存在,或者哈希不匹配,应用程序将强制终止。
在二进制文件中启用 ASAR 完整性
ASAR 完整性检查目前在 Electron 中默认禁用,可以通过切换 Electron 熔断器 EnableEmbeddedAsarIntegrityValidation
在构建时启用。
启用此熔断器时,您通常还希望启用 onlyLoadAppFromAsar
熔断器。否则,可以通过 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
配置应用程序的熔断器。
提供头部哈希
ASAR 完整性会验证 ASAR 归档的内容与您在打包时提供的头部哈希。提供此打包哈希的过程因 macOS 和 Windows 而异。
使用 Electron 工具
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
。