MIP SDK 會實作 SQLite3 資料庫,以維護 SDK 快取記憶體。 在 Microsoft 資訊保護 SDK 1.3 版之前,僅支援兩種類型的快取狀態記憶體:在磁碟和記憶體中。 這兩種類型都以純文本儲存特定數據,特別是受保護內容和原則信息的授權。
為了改善 SDK 的安全性狀態,我們新增了磁碟快取上第二種類型的支援,該快取會使用平臺特定的密碼編譯 API 來保護資料庫及其內容。
在載入設定檔作為FileProfileSettings、PolicyProfileSettings或ProtectionProfileSettings物件的一部分時,應用程式會定義快取類型。 對於配置檔的生命週期,快取類型是靜態的。 變更為不同類型的快取記憶體類型,需要終結現有的配置檔並建立新的配置檔。
快取記憶體類型
從 MIP SDK 1.3 版開始,可以使用下列記憶體快取類型。
| 類型 | 用途 |
|---|---|
| InMemory | 在應用程式中維護記憶體中的存儲快取。 |
| OnDisk | 將資料庫儲存在 settings 物件中提供的目錄中。 資料庫會以純文本儲存。 |
| OnDiskEncrypted | 將資料庫儲存在 settings 物件中提供的目錄中。 資料庫會使用OS特定的 API 進行加密。 |
應用程式所產生的每個 引擎 都會產生新的加密金鑰。
快取儲存是透過其中一個設定檔物件,使用枚舉來設置。
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 8 和更新版本 | Windows 7 僅支援 CacheStorageType::OnDisk |
| macOS | High Sierra 和更新的版本 | |
| Ubuntu Linux | 16.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\ 目錄中的所有檔案,或從預設設定變更的任何替代目錄,再將應用程式升級至新版本的 MIP SDK。
保護資料庫
| 桌子 | 用途 | 加密的 |
|---|---|---|
| AuthInfoStore | 儲存驗證挑戰詳細數據。 | 不 |
| ConsentStore | 儲存每個引擎的同意結果。 | 不 |
| DnsInfoStore | 儲存保護作業的 DNS 查閱結果 | 否 |
| EngineStore | 儲存引擎詳細數據、相關聯的使用者和自定義客戶端數據 | 否 |
| KeyStore | 儲存每個引擎的對稱加密金鑰。 | Yes |
| LicenseStore | 商店針對先前已解密的數據使用授權資訊。 | Yes |
| SdInfoStore | 儲存服務探索結果。 | 不 |
原則資料庫
| 表格 | 用途 | 加密的 |
|---|---|---|
| 密钥存儲 | 儲存每個引擎的對稱加密金鑰。 | Yes |
| 政策 | 儲存每個使用者的標籤原則資訊。 | Yes |
| 政策網址 | 儲存特定使用者的後端原則服務 URL。 | 不 |
| 敏感度 | 儲存特定用戶原則的分類規則。 | Yes |
| 敏感性URLs | 儲存特定使用者的後端敏感度原則服務 URL。 | 不 |
資料庫大小考慮
資料庫大小取決於兩個因素:要新增至快取的引擎數量,以及已快取的保護授權數量。 自 MIP SDK 1.3 起,沒有機制在授權快取到期時進行清理。 如果快取成長大於預期,則必須有外部程序來移除快取。
資料庫成長最重要的參與者是保護授權快取。 如果不需要授權快取,可能是因為服務來回行程不會影響您的應用程式效能,或快取可能會變大,則可以停用授權快取。 這是藉由將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 。 如果應用程式未提供標識碼,用戶端應用程式可以明確提供標識符,或 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)。
無法提供現有的 engineId 會導致額外的服務來回擷取原則,並擷取可能已針對現有引擎快取的授權。 將引擎標識碼快取起來,可以讓 SDK 在離線時存取先前解密的資訊,並提升整體性能。
後續步驟
接下來,深入瞭解 配置檔和引擎物件概念 ,以瞭解如何正確設定 MIP 引擎識別碼,以適當地利用 MIP SDK 快取。