客戶提供的加密金鑰

設定方式

這個頁面主要說明客戶提供的加密金鑰。如需其他加密選項,請參閱「資料加密選項」。

總覽

除了標準 Cloud Storage 加密之外,您也可以選擇提供自己的 AES-256 加密金鑰,並以標準 Base64 編碼。這類金鑰稱為「客戶提供的加密金鑰」。如果您提供客戶提供的加密金鑰,Cloud Storage 不會將金鑰永久儲存在伺服器中,也不會以其他方式管理金鑰。

您必須為每項 Cloud Storage 作業提供金鑰,作業完成後,金鑰就會從 Cloud Storage 伺服器中清除。Cloud Storage 只會儲存金鑰的密碼雜湊,以便根據雜湊驗證日後的要求。金鑰無法從這個雜湊復原,雜湊也不能用來解密您的資料。

建議您將每個金鑰備份到安全位置,並採取預防措施,確保金鑰不會與不受信任的對象共用。如果含有加密金鑰的檔案或機器遭到入侵,請立即針對所有使用遭入侵金鑰加密的物件執行金鑰輪替。

什麼時候會使用金鑰?

將客戶提供的加密金鑰套用於物件時,Cloud Storage 會在加密下列項目時使用金鑰:

  • 物件資料。
  • 物件的 CRC32C 總和檢查碼。
  • 物件的 MD5 雜湊。

標準 Cloud Storage 加密機制則用於加密物件的其他中繼資料,包括物件名稱。這樣一來,您就能讀取及更新一般中繼資料,以及列出、覆寫及刪除物件,不必使用客戶提供的加密金鑰。不過,您必須具備足夠的權限,才能執行上述任何操作。

例如,如果物件是使用客戶提供的加密金鑰進行加密,則必須使用該金鑰對物件執行操作,例如下載或將其移動。如果嘗試讀取物件的中繼資料,但未提供金鑰,您會收到物件名稱和 Content-Type 等中繼資料,但不會收到物件的 CRC32C 核對和或 MD5 雜湊。如果您在物件中繼資料要求中提供金鑰,則物件的 CRC32C 總和檢查碼和 MD5 雜湊就會隨附於中繼資料。

重寫行為

如果您重新寫入以客戶提供的加密金鑰加密的物件,但未提供用於加密重新寫入物件的金鑰,則會發生下列情況:

HTTPS 檢查

為了確保您的資料在進行讀寫作業時能透過網際網路安全傳輸,請使用傳輸層安全標準,一般稱為 TLS 或 HTTPS。提供加密金鑰時請務必採用 TLS。如果您不小心透過未加密的 (HTTP) 連線來使用加密金鑰,攻擊者可能就會趁機攔截您的金鑰。因此,如果您未使用加密連線,Cloud Storage API 會傳回錯誤訊息警告您金鑰可能會被盜用。萬一真的遇到這種情況,請立即輪替使用金鑰。

限制

下文說明使用客戶提供的加密金鑰時有哪些限制:

  • 您無法使用 Google Cloud 控制台下載以客戶「提供」的加密金鑰加密的物件。同樣地,使用Google Cloud 控制台上傳物件時,您無法使用客戶提供的加密金鑰加密物件。

  • Storage 移轉服務和 Cloud Dataflow 不支援以客戶提供的加密金鑰加密的物件。

  • 您只能為個別物件設定客戶提供的加密金鑰;無法針對值區設定預設客戶提供的加密金鑰。

  • 如果您對使用客戶提供的加密金鑰進行加密的物件執行 compose 作業,則元件物件也必須使用同一組金鑰加密,且您必須透過撰寫要求來提供金鑰。產生的複合物件將以同樣的金鑰加密。

  • 提供由客戶提供的加密金鑰加密的物件時,Cloud Storage 會忽略與物件相關聯的 Cache-Control 中繼資料,並將 Cache-Control 設為 private, max-age=0 來提供物件。

透過 REST API 使用加密金鑰

如果您使用客戶提供的加密金鑰並直接採用 JSON 或 XML API,則必須提供 AES-256 金鑰和金鑰的 SHA256 雜湊這兩項資料。請妥善保管 AES-256 金鑰及金鑰的 SHA256 雜湊。Cloud Storage 會將金鑰的 SHA256 雜湊儲存在物件的中繼資料中,方便您日後擷取。Cloud Storage (或任何其他使用者) 無法使用這個 SHA256 雜湊值解密您的資料。這項資訊會儲存下來,用來識別加密特定物件的 AES-256 金鑰。

要求標頭

在您的 JSON 或 XML 要求中納入以下 HTTP 標頭:

標頭名稱 值 說明
x-goog-encryption-algorithm 字串 要使用的加密演算法。您必須使用值 AES256。
x-goog-encryption-key 字串 您 AES-256 加密金鑰的 RFC 4648 Base64 編碼字串。
x-goog-encryption-key-sha256 字串 加密金鑰 SHA256 雜湊的 RFC 4648 Base64 編碼字串。

如果您透過 JSON API 執行重寫作業,以上所列的標頭將用於加密目標物件,而下列標頭用於解密來源物件:

標頭名稱 值 說明
x-goog-copy-source-encryption-algorithm 字串 要使用的加密演算法。您必須使用值 AES256。
x-goog-copy-source-encryption-key 字串 您 AES-256 加密金鑰的 RFC 4648 Base64 編碼字串。
x-goog-copy-source-encryption-key-sha256 字串 來源物件加密金鑰 SHA256 雜湊的 RFC 4648 Base64 編碼字串。

回應

JSON

使用 JSON API 時,系統會在回應主體中傳回客戶提供的加密金鑰中繼資料,其中包含下列屬性:

屬性名稱 值 說明
customerEncryption 物件 用於要求的加密相關資訊。
customerEncryption.encryptionAlgorithm 字串 使用的加密演算法,一律包含值 AES256。
customerEncryption.keySha256 字串 加密金鑰 SHA256 雜湊的 RFC 4648 Base64 編碼字串。您可使用這個 SHA256 雜湊來識別解密物件需要的唯一 AES-256 加密金鑰;請務必妥善保管該雜湊。

XML

使用 XML API 時,回應包含以下標頭:

標頭名稱 值 說明
x-goog-encryption-algorithm 字串 使用的加密演算法,一律包含值 AES256。
x-goog-encryption-key-sha256 字串 加密金鑰 SHA256 雜湊的 RFC 4648 Base64 編碼字串。您可使用這個 SHA256 雜湊來識別解密物件需要的唯一 AES-256 加密金鑰;請務必妥善保管該雜湊。

如遇下列情況會傳回 HTTP 400 錯誤:

  • 您使用客戶提供的加密金鑰上傳物件,並嘗試對物件執行其他作業 (不包括要求或更新大部分中繼資料,或刪除物件),但未提供金鑰。
  • 您使用客戶提供的加密金鑰上傳物件,並嘗試以不正確的金鑰對物件執行其他作業。
  • 您未使用客戶提供的加密金鑰來上傳物件,但嘗試以客戶提供的加密金鑰來對物件執行其他作業。
  • 您指定了無效的加密演算法、金鑰或 SHA256 雜湊。

使用 gcloud storage 的加密金鑰

Google Cloud CLI 支援使用客戶提供的加密金鑰。使用 gcloud CLI 和客戶提供的加密金鑰時,請注意下列事項:

  • 指定為加密金鑰的金鑰會用於指令中,同時做為加密金鑰,以及視需要做為解密金鑰。

  • 您最多可以指定 100 個解密金鑰,這些金鑰僅用於解密物件。

  • 解密時,系統會計算任何提供的加密和解密金鑰的 SHA256 雜湊,並比對物件中繼資料的 SHA256 雜湊,選取要用於特定物件的正確金鑰。

  • 為現有物件新增或輪替客戶提供的加密金鑰時,系統會重寫物件,做為要求的一部分。即使是 gcloud storage objects update 指令也一樣。

  • 如果清單指令傳回以客戶提供的金鑰加密的物件 MD5 或 CRC32C 雜湊值,則會為每個這類物件執行額外的中繼資料 GET 要求。這些額外要求可能會導致列出物件的速度大幅變慢,比列出以標準 Cloud Storage 加密方式加密的物件慢得多。

  • 如果加密金鑰在寫入或複製作業部分完成期間可能或確實變更,例如在強制退出或遇到網路逾時後重新執行 cp 上傳作業,系統會重新啟動作業,確保目的地物件是以新金鑰寫入。

加密金鑰輪替

如果物件使用客戶提供的加密金鑰進行加密,您可以重寫物件來輪替該物件的金鑰。JSON API 支援重寫作業,但 XML API 不支援。如需金鑰輪替範例,請參閱輪替加密金鑰一文。

後續步驟