本主題說明如何在本機加密資料,並透過 Tink 和 Cloud Key Management Service (Cloud KMS) 將資料上傳至 Cloud Storage。Tink 是 Google 密碼專家和安全工程師編寫的開放原始碼密碼編譯程式庫。
總覽
用戶端加密是指將資料傳送至雲端之前執行的任何加密作業。使用用戶端加密功能時,您必須負責建立及管理加密金鑰,並在將資料傳送至雲端前加密資料。
在本主題中,您將使用 Cloud KMS 中的加密金鑰,透過 Tink 實作用戶端信封式加密。
您可以在 kms-solutions GitHub 存放區中,找到以 Terraform 為基礎的藍圖版本教學課程。
事前準備
- 建立對稱的 Cloud KMS 加密金鑰,用於加密資料。請記下金鑰的 URI。稍後會需要用到。
- 安裝 Tink,以便與 Cloud KMS 搭配使用。
- 在 Cloud Storage 中建立值區,上傳已加密的資料。
必要的角色
為確保服務帳戶具有在 Tink 中使用 Cloud KMS 金鑰的必要權限,請要求管理員為您的金鑰授予 Cloud KMS CryptoKey 加密者/解密者 (roles/cloudkms.cryptoKeyEncrypterDecrypter
) IAM 角色。
管理員也可能會透過自訂角色或其他預先定義的角色,為您的服務帳戶授予必要權限。
使用 Tink 進行信封式加密
在信封式加密中,Cloud KMS 金鑰會做為金鑰加密金鑰 (KEK) 使用。也就是說,它用於加密資料加密金鑰 (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 支援使用「附帶相關資料的驗證式加密」(AEAD) 原始功能,在 Python、Java、C++ 和 Go 中進行信封式加密。
連結 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 用戶端程式庫。
如要向 Cloud KMS 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Java
Java
如要瞭解如何安裝及使用 Cloud KMS 的用戶端程式庫,請參閱 Cloud KMS 用戶端程式庫。
如要向 Cloud KMS 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
如要進一步瞭解 Tink 支援的原始類型和介面,請參閱 Tink 的入門指南。
後續步驟
- 進一步瞭解 Tink。
- 瞭解如何搭配 Cloud SQL 使用用戶端加密。