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,您可以使用 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
字典區塊。下面包含一個範例。
<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
。