加密應用程式資料

本頁面說明一種方法,可使用 Cloud Key Management Service 直接在用戶端上加密應用程式資料,然後透過網路傳輸。

在這個範例中,加密資料會傳送至 Google Cloud ,並儲存在 Cloud Storage 值區中。Cloud Storage 也支援使用客戶管理的加密金鑰自動執行伺服器端加密,可自動執行整個程序。如要保護應用程式資料,在傳送至Google Cloud之前,建議您使用 Tink 程式庫

Tink 程式庫是跨平台的多語言程式庫,可為常見的密碼編譯工作提供 API。這項服務可用於在資料進入 Google Cloud 資料儲存空間前加密資料,並支援 Java、Python、C++、Go、Objective-C 和其他語言,以及物件儲存空間和關聯式資料庫服務。

在本逐步操作說明中,您將使用 Cloud KMS 加密檔案,然後再上傳至值區。接下來,您可以下載並解密相同資料,以便在用戶端上讀取。

按照這些操作說明操作時,您的金鑰和所有加密編譯作業都會保留在 Google Cloud 中,您必須使用 Cloud KMS 進行解密。 原始對稱加密可讓您在內部部署環境中加密或解密資料,或是在不同程式庫和服務供應商之間移動已加密的資料,而無須先解密資料。

事前準備

您必須擁有 Google Cloud 機構組織的權限,才能建立新專案,並在這些專案中啟用帳單、建立使用者,以及管理權限。roles/resourcemanager.organizationAdmin 角色會授予這項權限。

設定

我們建議您使用兩個專案與兩位使用者,以確保授權區隔。如果您按照本指南中的步驟操作,管理加密金鑰的使用者和服務,與使用加密金鑰的使用者和服務不同。一個專案包含及管理金鑰,另一個專案則將加密資料儲存在 Cloud Storage 值區中,並視需要解密。

建立專案

您可以在 Google Cloud 控制台中建立專案。如需逐步操作說明,請參閱身分與存取權管理快速入門

在貴機構中建立下列專案:

  1. 建立 Google Cloud 專案,以包含用來儲存密鑰的 Cloud Storage 值區。密鑰將做為物件儲存在值區中。這個專案稱為 STORAGE_PROJECT_ID

  2. 建立第二個 Google Cloud 專案,用於管理用於加密及解密密鑰的 Cloud KMS 金鑰。這個專案稱為 KEY_PROJECT_ID

  3. 針對每個專案,請按照 Cloud KMS 快速入門導覽課程「開始前」一節中的步驟,啟用 Cloud KMS API 並啟用帳單功能。

建立使用者

您可以在 Google Cloud 控制台中建立使用者並授予角色。如需逐步操作說明,請參閱身分與存取權管理快速入門

這個程序會建立兩個使用者。金鑰管理員負責管理加密金鑰,而金鑰使用者則可使用金鑰加密及解密資料。

KEY_PROJECT_ID 專案中執行這項程序。

  1. 建立主要管理員帳戶。

  2. roles/cloudkms.admin Identity and Access Management 角色授予主要管理員。這個角色可讓金鑰管理員建立及管理金鑰。

  3. 建立主要使用者帳戶。

  4. roles/cloudkms.cryptoKeyEncrypterDecrypter IAM 角色授予主要使用者。這個角色可讓金鑰使用者加密及解密資料。

建立儲存空間值區

STORAGE_PROJECT_ID 專案中執行這項程序。

  1. 建立名為 STORAGE_BUCKET 的儲存空間值區
  2. STORAGE_BUCKET 儲存體值區的 roles/storage.objectAdmin 角色授予金鑰使用者帳戶。

建立加密金鑰

請以 KEY_PROJECT_ID 專案中的關鍵管理員身分執行這個程序。

  1. 建立金鑰環。金鑰環的名稱在專案中不得重複。您無法重新命名或刪除金鑰環。使用 Google Cloud CLI 建立金鑰環

    gcloud kms keyrings create KEY_RING \
      --location LOCATION
    

    更改下列內容:

    • KEY_RING:儲存空間鑰匙圈的名稱,例如 storage
    • LOCATION:您要在其中建立金鑰環的位置。此位置應位於您要建立 Cloud Storage 值區的地理位置附近。
  2. 在金鑰環中建立加密金鑰。金鑰的名稱在金鑰環中必須是唯一的。金鑰無法重新命名或刪除,但其金鑰版本可以刪除。使用 Google Cloud CLI 建立金鑰。系統會自動建立初始金鑰版本,並將其設為主要版本。

    gcloud kms keys create KEY_NAME \
      --location LOCATION \
      --keyring KEY_RING \
      --purpose encryption
    

    更改下列內容:

    • LOCATION:建立金鑰環的位置。
    • KEY_NAME:儲存空間鍵的名稱,例如 storage
    • KEY_RING:您用於儲存金鑰圈的名稱,例如 storage

    注意:如要使用原始對稱式加密金鑰,請將用途欄位設為 raw-encryption

如要進一步瞭解如何建立金鑰環和金鑰,請參閱這篇文章

加密包含密鑰的檔案

以主要使用者帳戶身分執行這個程序,在兩個專案中執行。

  1. 在本機電腦上儲存密鑰。

    echo "SECRET_TEXT" > PATH_TO_SECRET
    

    更改下列內容:

    • SECRET_TEXT:您要保護的祕密,以純文字格式表示,例如 this is a secret
    • PATH_TO_SECRET:您要建立機密金鑰的路徑,例如 secret.txt
  2. 使用 Cloud KMS 和加密金鑰加密密鑰。

    gcloud kms encrypt \
      --location LOCATION \
      --keyring KEY_RING \
      --key KEY_NAME \
      --plaintext-file PATH_TO_SECRET \
      --ciphertext-file PATH_TO_ENCRYPTED_SECRET
    

    更改下列內容:

    • LOCATION:建立金鑰環的位置。
    • KEY_RING:金鑰環的名稱。
    • KEY_NAME:加密金鑰的名稱。
    • PATH_TO_SECRET:建立機密金鑰的路徑。
    • PATH_TO_ENCRYPTED_SECRET:要儲存加密密鑰的路徑,例如 secret.txt.encrypted

    如要進一步瞭解如何加密資料,請參閱資料加密快速入門

    如要進行原始對稱加密,請改用 raw-encrypt

  3. 將已加密的密鑰檔案上傳至儲存值區。您可以使用下列 gcloud CLI 指令:

    gcloud storage cp PATH_TO_ENCRYPTED_SECRET gs://STORAGE_BUCKET
    

    如要進一步瞭解如何將物件上傳至儲存體值區,請參閱相關文章。

  4. 選用步驟:從本機電腦刪除明文密鑰檔案 (PATH_TO_SECRET)。對於含有未加密機密資料的檔案,這是最佳做法。

STORAGE_BUCKET 儲存空間值區現在包含已加密的密鑰檔案,該檔案是使用 KEY_NAME 加密金鑰加密的。

解密包含密鑰的檔案

以主要使用者帳戶身分執行這些步驟,並在兩個專案中執行。

  1. 從儲存值區下載已加密的密鑰檔案。您可以使用下列 gcloud CLI 指令:

    gcloud storage cp gs://STORAGE_BUCKET/PATH_TO_ENCRYPTED_SECRET .
    

    如要進一步瞭解如何從儲存體值區下載物件,請參閱相關文章。

  2. 使用用於加密檔案的相同金鑰解密檔案。

    gcloud kms decrypt --location LOCATION \
      --keyring KEY_RING \
      --key KEY_NAME \
      --ciphertext-file PATH_TO_ENCRYPTED_SECRET \
      --plaintext-file PATH_TO_DECRYPTED_SECRET
    

    更改下列內容:

    • LOCATION:建立金鑰環的位置。
    • KEY_RING:金鑰環的名稱。
    • KEY_NAME:加密金鑰的名稱。
    • PATH_TO_ENCRYPTED_SECRET:已下載的加密秘密的路徑,例如 secret.txt.encrypted
    • PATH_TO_DECRYPTED_SECRET:您要儲存已解密機密金鑰的路徑,例如 secret_decrypted.txt

    如要進一步瞭解如何解密資料,請參閱資料加密快速入門

    如要進行原始對稱加密,請改用 raw-decrypt

    您現在可以使用 cat 或文字編輯器,讀取已解密的祕密純文。內容與 PATH_TO_SECRET 的原始內容相同。

  3. 選用:從本機電腦刪除 PATH_TO_ENCRYPTED_SECRETPATH_TO_DECRYPTED_SECRET 檔案。

正在清除所用資源

如要清理,請刪除您在本機電腦上建立的所有檔案,然後刪除 KEY_PROJECT_IDSTORAGE_PROJECT_ID 專案。

後續步驟