跳至主要內容

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 中的保險絲

使用 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 字典區塊。下方包含一個範例。

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