跳到主要内容

ASAR 完整性

ASAR 完整性是一项实验性功能,可在运行时验证您的应用程序 ASAR 归档 的内容。

版本支持

目前,macOS 和 Windows 上支持 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 中的保险丝

使用 Electron Forge,您可以使用 @electron-forge/plugin-fuses 在 Forge 配置文件中配置应用程序的保险丝。

提供标头哈希

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