跳到主要内容

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 来启用。

启用此 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 中的 Fuses

使用 Electron Forge,您可以在 Forge 配置文件中使用 @electron-forge/plugin-fuses 配置应用程序的 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 字典块。示例如下。

Info.plist
<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 值仅为 SHA256hash 是使用给定算法对 ASAR 头部进行的哈希计算。 @electron/asar 包暴露了一个 getRawHeader 方法,其结果可以进行哈希计算以生成此值(例如,使用 node:crypto 模块)。

Windows

为 Windows 打包时,必须填充类型为 Integrity、名称为 ElectronAsar 的有效资源条目。此资源的值应为 JSON 编码的字典,格式如下所示:

[
{
"file": "resources\\app.asar",
"alg": "sha256",
"value": "9d1f61ea03c4bb62b4416387a521101b81151da0cfbe18c9f8c8b818c5cebfac"
}
]
信息

有关实现示例,请参阅 Electron Packager 代码中的 src/resedit.ts