MIP SDK 會實作 SQLite3 資料庫,以維護 SDK 快取記憶體。 在 Microsoft 資訊保護 SDK 1.3 版之前,僅支援兩種類型的快取狀態記憶體:在磁碟和記憶體中。 這兩種類型都以純文本儲存特定數據,特別是受保護內容和原則信息的授權。
為了改善 SDK 的安全性狀態,我們新增了磁碟快取上第二種類型的支援,該快取會使用平臺特定的密碼編譯 API 來保護資料庫及其內容。
在載入設定檔作為FileProfileSettings、PolicyProfileSettings或ProtectionProfileSettings物件的一部分時,應用程式會定義快取類型。 對於配置檔的生命週期,快取類型是靜態的。 變更為不同類型的快取記憶體類型,需要終結現有的配置檔並建立新的配置檔。
快取儲存類型
從 MIP SDK 1.3 版開始,可以使用下列記憶體快取類型。
| 類型 | 用途 |
|---|---|
| InMemory | 在應用程式中維護記憶體中的存儲快取。 |
| OnDisk | 將資料庫儲存在 settings 物件中提供的目錄中。 資料庫會以純文本儲存。 |
| OnDiskEncrypted | 將資料庫儲存在 settings 物件中提供的目錄中。 資料庫會使用OS特定的 API 進行加密。 |
應用程式所產生的每個 引擎 都會產生新的加密金鑰。
你可以在其中一個設定檔設定物件中,透過 mip::CacheStorageType 列舉來設定快取儲存空間。
FileProfile::Settings profileSettings(mMipContext,
mip::CacheStorageType::OnDiskEncrypted, // Define the storage type to use.
mAuthDelegate,
std::make_shared<sample::consent::ConsentDelegateImpl>(),
std::make_shared<FileProfileObserver>());
何時使用每個類型
快取儲存對於維持對先前解密資訊的離線存取,以及在資料先前被消耗時,確保解密操作的效能非常重要。
- 記憶體儲存:適用於長期運行的程序,當不需要在服務重新啟動時保留政策或許可證快取資訊時使用這種儲存類型。
- 磁碟儲存:如果應用程式中的程序可能會頻繁停止和啟動,但必須在重新啟動後仍保留原則、授權和服務探索快取,請使用此儲存類型。 此記憶體快取類型是純文字,因此較適合使用者無法存取狀態記憶體的伺服器工作負載。 例如,在伺服器上執行的 Windows 服務或 Linux 精靈,或只有服務管理員才能存取狀態數據的 SaaS 應用程式。
- 儲存在磁碟上並加密:此儲存類型適用於處理程序可能經常停止又重新啟動,但必須在重新啟動之間保留政策、授權和服務探索快取的應用程式。 此儲存快取是加密的,因此更適合工作站應用,使用者可能會瀏覽並發現狀態資料庫。 加密有助於確保窺探的使用者無法以純文字取得政策內容或保護授權內容。 在所有情況下,資料都以使用者可存取的金鑰加密。 熟練的敵人能夠以最少的心力解密快取,但這可避免竄改和流覽。
支援的加密平台
| 平台 | 版本 | 備註 |
|---|---|---|
| Microsoft Windows | Windows 11,Windows Server 的支援版本 | |
| macOS | High Sierra 和更新的版本 | |
| Ubuntu Linux | 22.04及之後 |
SecretService需要和LinuxEncryptedCache功能旗標。 |
| Android | Android 7.0 或更新版本 | |
| iOS | 所有支援的版本 |
雖然 MIP SDK 支援其他 Linux 發行版,但我們並未在 RedHat Enterprise Linux、CentOS 或 Debian 上測試快取加密。
注意
你使用 mip::MipConfiguration::SetFeatureSettings() 設定功能旗標,以在 Linux 上啟用快取儲存。
快取記憶體資料庫數據表
MIP SDK 會維護兩個用於快取的資料庫。 其中一個適用於保護 SDK,並維護保護狀態詳細數據。 另一個是用於政策 SDK 並維護政策詳細資料和服務資訊。 兩者都會儲存在設定物件中定義的路徑中,在 mip\mip.policies.sqlite3 和 mip\mip.protection.sqlite3 下。
注意
MIP SDK 並不保證其快取不同版本之間的相容性。 在升級應用程式到新版本的 MIP SDK 之前,先清除 mip\ 目錄內的所有檔案,或任何從預設設定更改的替代目錄。
保護資料庫
| 桌子 | 用途 | 加密的 |
|---|---|---|
| AuthInfoStore | 儲存驗證挑戰詳細數據。 | 不 |
| ConsentStore | 儲存每個引擎的同意結果。 | 不 |
| DnsInfoStore | 儲存保護作業的 DNS 查閱結果 | 不 |
| EngineStore | 儲存引擎詳細數據、相關聯的使用者和自定義客戶端數據 | 不 |
| KeyStore | 儲存每個引擎的對稱加密金鑰。 | Yes |
| LicenseStore | 商店針對先前已解密的數據使用授權資訊。 | Yes |
| SdInfoStore | 儲存服務探索結果。 | 不 |
政策資料庫
| 桌子 | 用途 | 加密的 |
|---|---|---|
| KeyStore | 儲存每個引擎的對稱加密金鑰。 | Yes |
| 政策 | 儲存每個使用者的標籤原則資訊。 | Yes |
| 政策網址 | 儲存特定使用者的後端原則服務 URL。 | 不 |
| 敏感度 | 儲存特定用戶原則的分類規則。 | Yes |
| 敏感性URLs | 儲存特定使用者的後端敏感度原則服務 URL。 | 不 |
資料庫大小考慮
資料庫大小取決於兩個因素:新增到快取的引擎數量以及快取的保護許可證數量。 從 MIP SDK 1.18 開始,你可以在 ProtectionEngine 上使用 DeleteStoredData(),以程式設計方式移除快取的引擎資料。 對於早期版本,若快取容量超過預期,可能需要外部程序來移除。
資料庫成長最重要的參與者是保護授權快取。 如果不需要授權快取,無論是因為與服務之間的往返不會影響應用程式效能,還是因為快取可能會變得過大,你都可以停用授權快取。 若要這麼做,請將 FileProfile::Settings 物件上的 CanCacheLicenses 設為 false。
FileProfile::Settings profileSettings(mMipContext,
mip::CacheStorageType::OnDiskEncrypted,
mAuthDelegate,
std::make_shared<sample::consent::ConsentDelegateImpl>(),
std::make_shared<FileProfileObserver>());
profileSettings.SetCanCacheLicenses(false);
快取引擎
在 MIP SDK 中,會針對執行任何已驗證作業的每個使用者建立引擎。 引擎為所有代表已認證身份執行的操作提供介面。 如配置檔和引擎概念中所述,FileEngine、PolicyEngine 或 ProtectionEngine 各有兩個狀態CREATED和 LOADED。 必須建立並載入引擎,才能執行 SDK 作業。 如果引擎不在使用中,SDK 會快取引擎,並根據可用的資源盡可能保留該引擎的狀態 CREATED 。 每個個別 SDK 的 設定檔 類別也會提供一種方法 UnloadEngineAsync ,以明確達成此目的。
每個引擎都有用於所有引擎管理作業的唯一標識碼 id 。 客戶端應用程式可以明確提供 ID;如果應用程式未提供,SDK 也可以產生一個。 如果在引擎建立時使用引擎設定物件來提供唯一標識符,且 API 配置檔中已啟用快取,則每次使用者與 SDK 執行作業時,都可以使用相同的引擎。 請遵循程式碼片段來建立 [mip::FileEngine](./concept-profile-engine-file-engine-cpp.md#create-file-engine-settings)、[mip::PolicyEngine](./concept-profile-engine-policy-engine-cpp.md#implementation-create-policy-engine-settings)。
若未提供現有的引擎 ID,將導致額外的服務往返以擷取原則,並會擷取現有引擎中可能已快取的授權。 將引擎標識碼快取起來,可以讓 SDK 在離線時存取先前解密的資訊,並提升整體性能。
下一步
接著,進一步了解 Profile 與 Engine 物件的概念 ,以了解如何正確設定 MIP 引擎 ID 以正確使用 MIP SDK 快取。