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 保险丝 来启用。
启用此保险丝时,通常也希望启用 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 工具
只要启用了 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。