共用方式為


Microsoft 資訊保護 SDK - 快取記憶體

MIP SDK 會實作 SQLite3 資料庫,以維護 SDK 快取記憶體。 在 Microsoft 資訊保護 SDK 1.3 版之前,僅支援兩種類型的快取狀態記憶體:在磁碟和記憶體中。 這兩種類型都以純文本儲存特定數據,特別是受保護內容和原則信息的授權。

為了改善 SDK 的安全性狀態,我們新增了磁碟快取上第二種類型的支援,該快取會使用平臺特定的密碼編譯 API 來保護資料庫及其內容。

當將設定檔載入為、 PolicyProfileSettingsProtectionProfileSettings 物件的一部分FileProfileSettings時,應用程式會定義快取類型。 快取類型是配置檔生命週期的靜態類型。 變更為不同類型的快取記憶體類型,需要終結現有的配置檔並建立新的配置檔。

快取記憶體類型

從 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 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 上測試快取加密。

注意

透過設定在Linux上啟用快取記憶體的功能旗標 mip::MipConfiguration::SetFeatureSettings()

快取記憶體資料庫數據表

MIP SDK 會維護兩個用於快取的資料庫。 其中一個適用於保護 SDK,並維護保護狀態詳細數據。 另一個是原則 SDK,並維護原則詳細數據和服務資訊。 兩者都會儲存在設定物件中定義的路徑中,在 mip\mip.policies.sqlite3mip\mip.protection.sqlite3

注意

MIP SDK 不保證其快取不同版本的相容性。 建議您先清除 mip\ 目錄中的所有檔案,或從預設設定變更的任何替代目錄,再將應用程式升級至新版本的 MIP SDK。

保護資料庫

Table 目的 Encrypted
AuthInfoStore 儲存驗證挑戰詳細數據。 No
ConsentStore 儲存每個引擎的同意結果。 No
DnsInfoStore 儲存保護作業的 DNS 查閱結果 No
EngineStore 儲存引擎詳細數據、相關聯的使用者和自定義客戶端數據 No
KeyStore 儲存每個引擎的對稱加密金鑰。 Yes
LicenseStore 儲存會針對先前解密的數據使用授權資訊。 Yes
SdInfoStore 儲存服務探索結果。 No

注意

LicenseStore 快取需要在保護引擎或檔案引擎設定身分識別。

原則資料庫

Table 目的 Encrypted
KeyStore 儲存每個引擎的對稱加密金鑰。 Yes
原則 儲存每個使用者的標籤原則資訊。 Yes
PoliciesUrl 儲存特定使用者的後端原則服務 URL。 No
敏感度 儲存特定用戶原則的分類規則。 Yes
SensitivityUrls 儲存特定使用者的後端敏感度原則服務 URL。 No

資料庫大小考慮

資料庫大小取決於兩個因素:要新增至快取的引擎數量,以及已快取的保護授權數量。 從 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 各有兩個狀態CREATEDLOADED。 必須建立並載入引擎,才能執行 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 快取。