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 工具
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
。