這個頁面主要說明客戶提供的加密金鑰。如需其他加密選項,請參閱「資料加密選項」。
總覽
除了標準 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 雜湊就會隨附於中繼資料。
重寫行為
如果您重新寫入以客戶提供的加密金鑰加密的物件,但未提供用於加密重新寫入物件的金鑰,則會發生下列情況:
如果您在要求中加入適當的解密金鑰,系統會使用目的地 bucket 的預設 Cloud Key Management Service 加密金鑰,或標準 Cloud Storage 加密 (如果沒有這類金鑰),對重寫的物件進行加密。
如果要求中未包含適當的解密金鑰,就會收到錯誤。
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 不支援。如需金鑰輪替範例,請參閱輪替加密金鑰一文。