本主題說明如何使用 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 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
Java
Java
如要瞭解如何安裝及使用 Cloud KMS 的用戶端程式庫,請參閱這篇文章。
如要向 Cloud KMS 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。
如要進一步瞭解 Tink 支援的基元和介面,請參閱 Tink 的「開始使用」頁面。
後續步驟
- 進一步瞭解 Tink。
- 瞭解如何搭配 Cloud SQL 使用用戶端加密。