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 中当前处于禁用状态,可以通过切换 EnableEmbeddedAsarIntegrityValidation
Electron 保险丝 (Fuse) 在构建时启用。
启用此保险丝时,通常还希望启用 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,您可以使用 @electron-forge/plugin-fuses 在 Forge 配置文件中配置应用程序的保险丝 (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
。