本主題說明如何使用 Tink 和 Cloud Key Management Service (Cloud KMS) 在本機加密資料,然後上傳至 Cloud Storage。Tink 是由 Google 的密碼專家和安全工程師編寫的開放原始碼密碼編譯程式庫。
總覽
用戶端加密是指在將資料傳送到雲端之前執行的任何加密作業。使用用戶端加密時,您必須負責建立及管理加密金鑰,並在將資料傳送至雲端前加密。
在本主題中,您將使用 Tink 實作用戶端信封式加密,並使用 Cloud KMS 中的加密金鑰。
您可以在 kms-solutions GitHub 存放區中,找到以 Terraform 為基礎的本教學課程藍圖版本。
事前準備
- 建立對稱 Cloud KMS 加密金鑰,用於加密。請記下金鑰的 URI。稍後會需要用到。
- 安裝 Tink,以便搭配 Cloud KMS 使用。
- 在 Cloud Storage 中建立 bucket,上傳加密資料。
必要的角色
為確保服務帳戶具備使用 Tink 搭配 Cloud KMS 金鑰的必要權限,請要求管理員授予服務帳戶金鑰的 Cloud KMS CryptoKey 加密者/解密者 (roles/cloudkms.cryptoKeyEncrypterDecrypter
) IAM 角色。
管理員或許也能透過自訂角色或其他預先定義的角色,將必要權限授予服務帳戶。
使用 Tink 進行信封式加密
在信封式加密中,Cloud KMS 金鑰會做為金鑰加密金鑰 (KEK)。也就是說,KEK 用來加密資料加密金鑰 (DEK),而 DEK 則用來加密實際資料。
在 Cloud KMS 中建立 KEK 後,如要加密每則訊息,請執行下列操作:
- 在本機產生資料加密金鑰 (DEK)。
- 在本機使用 DEK 加密訊息。
- 使用 Cloud KMS 以 KEK 加密 (包裝) DEK。
- 儲存加密的資料與經過包裝的 DEK。
使用 Tink 時,您不需要從頭開始實作這個信封加密程序。
如要使用 Tink 進行信封式加密,請向 Tink 提供金鑰 URI 和憑證。金鑰 URI 會指向 Cloud KMS 中的 KEK,而憑證則可讓 Tink 使用 KEK。Tink 會產生 DEK、加密資料、包裝 DEK,然後傳回包含加密資料和包裝 DEK 的單一密文。
Tink 支援 Python、Java、C++ 和 Go 中的信封式加密,方法是使用附帶相關資料的驗證式加密 (AEAD) 原始功能。
連結 Tink 和 Cloud KMS
如要使用 Cloud KMS 中的 KEK 加密 Tink 產生的 DEK,您需要取得 KEK 的 URI。在 Cloud KMS 中,KEK URI 的格式如下:
gcp-kms://projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
如要瞭解如何取得金鑰路徑,請參閱「取得 Cloud KMS 資源 ID」。
初始化 Tink 並加密資料
Tink 會使用基本元素 (管理基礎演算法詳細資料的加密建構區塊),讓您安全地執行工作。每個基本項目都提供可處理特定工作的 API。這裡我們使用 AEAD,因此使用 Tink AEAD 基本類型。
Python
Python
如要瞭解如何安裝及使用 Cloud KMS 的用戶端程式庫,請參閱這篇文章。
如要向 Cloud KMS 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN
環境變數設為 s3nsapis.fr
。
Java
Java
如要瞭解如何安裝及使用 Cloud KMS 的用戶端程式庫,請參閱這篇文章。
如要向 Cloud KMS 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
執行程式碼範例前,請將 GOOGLE_CLOUD_UNIVERSE_DOMAIN
環境變數設為 s3nsapis.fr
。
如要進一步瞭解 Tink 支援的基元和介面,請參閱 Tink 的「開始使用」頁面。
後續步驟
- 進一步瞭解 Tink。
- 瞭解如何搭配 Cloud SQL 使用用戶端加密。