佇列的用戶端加密

適用於 .NET 和 Python 的 Azure 佇列儲存體用戶端程式庫支援在上傳至 Azure 儲存體之前加密用戶端應用程式內的資料,並在下載至用戶端時將資料解密。 用戶端程式庫也支援與 Azure Key Vault 整合,以進行儲存體帳戶金鑰管理。

重要

Azure 儲存體同時支援服務端和用戶端加密。 在大部分情況下,Microsoft 建議使用服務端加密功能,以方便用來保護資料。 若要深入了解服務端加密,請參閱待用資料的 Azure 儲存體加密

關於用戶端加密

Azure 佇列儲存體用戶端程式庫使用 AES 來加密使用者資料。 用戶端程式庫中有兩個可用的用戶端加密版本:

警告

因為用戶端程式庫 CBC 模式實作的安全性弱點,所以不再建議使用第 1 版的用戶端加密。 如需此安全性弱點的詳細資訊,請參閱Azure 儲存體更新 SDK 中的用戶端加密以解決安全性弱點。 如果您目前使用第 1 版,則建議您更新應用程式以使用第 2 版,並移轉您的資料。 如需進一步指導,請參閱下節:降低應用程式中的安全性弱點

降低應用程式中的安全性弱點

因為發現佇列儲存體用戶端程式庫 CBC 模式實作中的安全性弱點,所以 Microsoft 建議您立即採取下列一或多個動作:

  • 請考慮使用服務端加密功能,而不是用戶端加密。 如需服務端加密功能的詳細資訊,請參閱待用資料的 Azure 儲存體加密

  • 如果您需要使用用戶端加密,則請將您的應用程式從用戶端加密 v1 移轉至用戶端加密 v2。

下表摘要說明您選擇將應用程式移轉至用戶端加密 v2 時需要採取的步驟:

用戶端加密狀態 建議動作
應用程式搭配使用用戶端加密與僅支援用戶端加密 v1 的用戶端程式庫版本。 更新您的應用程式,以使用支援用戶端加密 v2 的用戶端程式庫版本。 如需支援的版本清單,請參閱用戶端加密的 SDK 支援矩陣

更新您的程式碼以使用用戶端加密 v2。
應用程式搭配使用用戶端加密與支援用戶端加密 v2 的用戶端程式庫版本。 更新您的程式碼以使用用戶端加密 v2。

此外,Microsoft 建議您採取下列步驟來協助保護資料:

  • 將您的儲存體帳戶設定為使用私人端點,以透過私人連結保護虛擬網路 (VNet) 與儲存體帳戶之間的所有流量。 如需詳細資訊,請參閱針對 Azure 儲存體使用私人端點
  • 僅限制對特定網路的網路存取。

用戶端加密的 SDK 支援矩陣

下表顯示哪些適用於 .NET 和 Python 的用戶端程式庫版本支援哪些用戶端端加密版本:

.NET Python
用戶端加密 v2 和 v1 12.11.0 版和更新版本 12.4.0 版和更新版本
僅限用戶端加密 v1 12.10.0 版和更新版本 12.3.0 版和更新版本

如果您的應用程式搭配使用用戶端加密與舊版 .NET 或 Python 用戶端程式庫,則您必須先將程式碼升級至支援用戶端加密 v2 的版本。 接下來,您必須使用用戶端加密 v2 來解密並重新加密資料。 如有必要,您可以在移轉程式碼時,使用並存支援用戶端加密 v2 與舊版用戶端程式庫的用戶端程式庫版本。

用戶端加密運作方式

Azure 佇列儲存體用戶端程式庫會使用信封加密來加密和解密用戶端上的資料。 信封加密會使用一或多個額外的金鑰來加密金鑰。

佇列儲存體用戶端程式庫依賴 Azure Key Vault 來保護用於用戶端加密的金鑰。 如需 Azure Key Vault 的詳細資訊,請參閱什麼是 Azure Key Vault

透過信封技術進行加密和解密

透過信封技術的加密運作如下:

  1. Azure 儲存體用戶端程式庫會產生內容加密金鑰 (CEK),這是使用一次的對稱金鑰。

  2. 使用 CEK 來加密使用者資料。

  3. 然後使用金鑰加密金鑰 (KEK) 包裝 (加密) CEK。 KEK 是以金鑰識別碼予以識別,而且可以是非對稱金鑰組或對稱金鑰。 您可以在本機管理 KEK,或將其儲存至 Azure Key Vault。

    Azure 儲存體用戶端程式庫本身永遠無法存取 KEK。 程式庫會叫用金鑰保存庫所提供的金鑰包裝演算法。 如有需要,使用者可以選擇使用自訂提供者來包裝/取消包裝金鑰。

  4. 接著會將已加密的資料上傳至 Azure 佇列儲存體。 已包裝的金鑰與一些額外的加密中繼資料會插入已加密的資料。

透過信封技術的解密運作如下:

  1. Azure 儲存體用戶端程式庫假設使用者在本機或 Azure Key Vault 中管理 KEK。 使用者不必知道用於加密的特定金鑰。 相反地,可以設定並使用金鑰解析程式,將不同的金鑰識別碼解析成金鑰。
  2. 用戶端程式庫會下載加密的資料,以及任何儲存在 Azure 儲存體中的加密資料。
  3. 已包裝的 CEK 接著會使用 KEK 解除包裝 (解密)。 用戶端程式庫在此程序期間無法存取 KEK,而是只會叫用 Azure Key Vault 或其他金鑰存放區的解除包裝演算法。
  4. 用戶端程式庫會使用 CEK 來解密加密的使用者資料。

訊息加密/解密

因為佇列訊息可以是任何格式,用戶端程式庫會定義自訂的格式,其中包含訊息文字中的初始化向量 (IV) 和加密的內容加密金鑰 (CEK)。

在加密期間,用戶端程式庫會產生 16 位元組的隨機 IV,以及 32 位元組的隨機 CEK,並使用這項資訊執行佇列訊息文字的信封加密。 然後,已包裝的 CEK 和一些其他加密中繼資料會加入至已加密的佇列訊息。 這個修改過的訊息 (如下所示) 會儲存在服務上。

<MessageText>{"EncryptedMessageContents":"6kOu8Rq1C3+M1QO4alKLmWthWXSmHV3mEfxBAgP9QGTU++MKn2uPq3t2UjF1DO6w","EncryptionData":{…}}</MessageText>

在解密期間,從佇列訊息中擷取已包裝的金鑰,並解除包裝。 IV 也會從佇列訊息中擷取,並與未包裝的金鑰一起用來解密佇列訊息資料。 加密中繼資料很小 (小於 500 位元組),雖然計入佇列訊息的 64 KB 限制內,但影響仍在可掌控的範圍內。 已加密的訊息會以 Base64 編碼 (如上述程式碼片段所示),這也會擴充所傳送的訊息大小。

因為佇列中訊息的短期本質,所以在更新至用戶端加密 v2 之後,應該就不需要解密和重新加密佇列訊息。 任何較不安全的訊息都會在正常佇列耗用過程輪替。

用戶端加密和效能

請記住,加密您的儲存體資料會造成額外的效能負擔。 當您在應用程式中使用用戶端加密時,用戶端程式庫必須安全地產生 CEK 和 IV、加密內容本身、與您選擇的金鑰存放區通訊以進行金鑰信封處理,以及格式化和上傳其他中繼資料。 這個額外負荷會因所加密資料的數量而不同。 我們建議客戶一定要在開發期間測試其應用程式的效能。

下一步