可以使用 SQLite 加密擴充功能 (SEE) 的副本創建 JavaScript/WASM 組建,但這樣做有一些注意事項。
此專案不提供預先建置的 WASM SEE 組建。需要 SEE 組建的用戶必須自行創建組建(請參閱下面的說明)。同樣,此類組建沒有 npm 套件(或類似套件)(並且 SEE 許可證禁止此類分發),因此使用 SEE 的客戶端必須以傳統方式使用原生 JS,且不使用套件管理器。
SEE 的許可證與透過用戶端 WASM 分發 SQLite 的方式有所衝突。官方立場是,SEE 授權方在其組織內的私有/僅限內網的應用程式中託管具有 SEE 功能的 WASM 組建是可以接受的,但不允許在面向公眾的網站上或向未取得 SEE 授權的組織託管 SEE WASM 組建。請注意,「伺服器端」WASM 組建不受 SEE 許可證的影響,但此頁面專門涵蓋瀏覽器端 WASM 的使用。
這裡只能使用不需要第三方程式庫依賴項的加密選項。簡而言之,這意味著用戶端僅限於使用
sqlite3-see.c
原始程式檔,而不是其他sqlite3-see-XYZ.c
變體之一。JavaScript 無法可靠地隱藏 SEE 加密金鑰。任何載入具有 SEE 功能網站的用戶都可以自由檢查 JavaScript 程式碼和其他資源。確保加密金鑰保密的唯一方法是要求終端用戶手動輸入金鑰(請注意,瀏覽器端密碼管理器會主動提供儲存金鑰的功能)。
對於永久儲存選項,加密可以說是多餘的,因為底層資料鎖定在瀏覽器特定的儲存空間中,即使是瀏覽器的用戶也無法讀取。可以這樣說,任何可以直接存取特定用戶登入資訊和瀏覽器的人都可以讀取內容,但「物理存取權凌駕所有安全措施」的反駁論點也適用(另請參閱上述關於密碼管理器的說明)。在非永久儲存模式中,加密是不必要的,因為資料庫僅存在於記憶體中。SEE 並不會特別加密記憶體中或暫存的資料庫,而非永久儲存選項實際上是透過(暫時性)類似檔案系統的路徑存取的記憶體中資料庫。
創建具有 SEE 功能的 WASM 組建
建置 SQLite WASM 套件需要安裝了 Emscripten 工具的 Linux 系統。安裝這些工具的說明可以在 標準 sqlite 原始碼樹 中找到。
安裝這些工具後,從已簽出的 SQLite 標準原始碼樹 的最上層目錄執行以下操作即可輕鬆創建 SEE 套件:
$ ./configure --enable-all # or preferred flags
$ cd ext/wasm
$ . /path/to/emsdk_env.sh # part of the Emscripten tools
$ make sqlite3.c=/path/to/sqlite3-see.c # needs to be an absolute path
產生的組建成品都可以在 jswasm
子目錄中找到。當然,建置時間會因系統而異。中階 x64 機器通常在大約 45 秒內完成建置。
對於專門且重複創建具有 SEE 功能組建的用戶,可以透過將 sqlite3-see.c
的副本或符號連結放置在組建樹的最上層目錄中來簡化上述步驟。
$ ln -s /path/to/sqlite3-see.c . # only needed once
$ ./configure --enable-all # or preferred flags
$ cd ext/wasm
$ . /path/to/emsdk_env.sh # part of the Emscripten tools
$ make
請注意,可以使用 make
的 -j#
旗標將組建平行化,其中 #
是要執行的平行 make
執行個體的數量。然而,組建中執行時間最長的部分並不會因此受益,因此將 #
設定為任意高的值並不會顯著加快組建速度1。
如果一切順利,組建的輸出將以如下內容開頭:
$ make
using emcc version [3.1.57]
This is an SEE build.
...
如果沒有出現「SEE」字樣(或其他等效訊息),則表示該建置版本不支援 SEE。也可以檢查產生的 JS 原始碼來判斷是否為 SEE 建置版本。
$ grep -w sqlite3_key_v2 jswasm/sqlite3.js
如果有任何輸出,則表示產生的建置版本支援 SEE。
在 SEE 和非 SEE 建置版本之間切換時,每次建置之間都必須執行 make clean
,否則建置可能會完全失敗或靜默地無法包含 SEE API。
使用 SEE 建置版本
SEE 建置版本的使用方式與主要發行版本相同,但也包含各種與加密相關的 sqlite3 API 函式,例如 sqlite3_key_v2()
。這些函式並*非*使用加密所必需的,因為每個此類 API 也都可以透過 pragma 存取,如SEE 文件中所述。JS/WASM 建置版本中是否存在 SEE 特定函式可用於區分其與非 SEE 建置版本。
從 3.46 版開始,oo1 API 以DB
類別及其子類別建構函式的選用引數的形式支援 SEE。
- ^ 由於涉及
sqlite3.wasm
建置方式的冗長且無聊的技術原因。