標準 SQL 中的 AEAD 加密概念

本主題說明 BigQuery 中 AEAD 加密的相關概念。如需 BigQuery 支援的不同 AEAD 加密函式相關說明,請參閱 AEAD 加密函式

AEAD 加密的目的

BigQuery 採用靜態加密技術,可確保資料安全無虞。BigQuery 也支援客戶管理的加密金鑰 (CMEK),可讓您使用特定加密金鑰將資料表加密。但在某些情況下,您可能需要加密資料表中的個別值。

例如,您希望將自己的所有客戶資料保存在通用資料表中,並使用不同金鑰為每位客戶的資料加密。您的資料分布在多個資料表中,而您希望對資料表進行「加密式刪除」作業。加密式刪除或加密式銷毀程序是指刪除加密金鑰,使以該金鑰加密的所有資料無法讀取。

AEAD 加密函式可讓您建立包含加密和解密金鑰的金鑰組、使用這些金鑰將資料表中的個別值加密和解密,以及輪替金鑰組內的金鑰。

金鑰組

金鑰組是一組加密編譯金鑰,其中一個金鑰是主要加密編譯金鑰,其餘金鑰 (若有) 為次要加密編譯金鑰。無論是已啟用、已停用或已刪除的金鑰,每個金鑰會針對加密或解密演算法進行編碼;未刪除的金鑰會對金鑰位元組本身進行編碼。主要加密編譯金鑰會判斷如何加密輸入明文,且永遠不會處於已停用狀態。次要加密編譯金鑰僅用於解密,可以是已啟用或已停用狀態。金鑰組可用於解密最初用來加密的任何資料。

BigQuery 金鑰組會以序列化的 google.crypto.tink.Keyset 通訊協定緩衝區表示 (採用 BYTES 編碼)。

示例

以下的 AEAD 金鑰組示例是以三個金鑰表示的 JSON 字串。

primary_key_id: 569259624
key {
  key_data {
    type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
    value: ",&\264kh\377\306\217\371\233E<\0350A4\023B-pd\203\277\240\371\212^\210bf\347\256"
    key_material_type: SYMMETRIC
  }
  status: ENABLED
  key_id: 569259624
  output_prefix_type: TINK
}
key {
  key_data {
    type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
    value: "\374\336+.\333\245k\364\010`\037\267!\376\233\\3\215\020\356B\236\240O\256U\021\266\217\277\217\271"
    key_material_type: SYMMETRIC
  }
  status: DISABLED
  key_id: 852264701
  output_prefix_type: TINK
}
key {
  status: DESTROYED
  key_id: 237910588
  output_prefix_type: TINK
}

在上面的示例中,主要加密編譯金鑰的 ID 為 569259624,是 JSON 字串中列出的第一個金鑰。示例中有兩個次要加密編譯金鑰,其中一個金鑰的 ID 為 852264701,處於已停用狀態;另一個金鑰的 ID 為 237910588,處於已刪除狀態。當 AEAD 加密函式使用這個金鑰組進行加密時,產生的密文會將 ID 為 569259624 的主要加密編譯金鑰編碼。

當 AEAD 函式使用這個金鑰組進行解密時,函式會根據在密文中編碼的金鑰 ID 選擇適當的金鑰進行解密。在上述示例中,嘗試使用金鑰 ID 852264701237910588 解密會發生錯誤,因為金鑰 ID 852264701 已停用,而金鑰 ID 237910588 已刪除。將金鑰 ID 852264701 恢復到已啟用狀態,即可使用該金鑰進行解密。

金鑰類型會決定可搭配金鑰使用的加密模式

如果您使用相同的金鑰組加密明文超過一次,系統通常會傳回不同的密文值,這是因為使用 OpenSSL 虛擬隨機號碼產生器所選擇的初始向量 (IV) 不同所致。

進階加密標準 (AES)

AEAD 加密函式採用進階加密標準 (AES) 加密技術。AES 加密會將明文當做輸入,搭配一個加密編譯金鑰使用,並傳回已加密的位元組序列做為輸出。日後要解密這個位元組序列時,可使用與加密時相同的金鑰進行。AES 使用 16 位元組的區塊大小,也就是說 AES 將明文視為 16 位元組區塊的序列。密文會包含 Tink 專屬的前置字串,指出用來執行加密的金鑰。AES 加密支援多種區塊加密模式

區塊加密模式

AEAD 加密函式支援兩種區塊加密模式:GCM 和 CBC。

GCM

Galois/計數器模式 (GCM) 是一種 AES 加密模式。函式會依序將區塊編號,然後將區塊編號與初始向量 (IV) 合併。初始向量可為隨機值或虛擬隨機值,是將明文資料隨機化的基礎。接下來,函式會使用 AES 加密合併的區塊編號和 IV,然後對加密結果和明文執行位元邏輯互斥或 (XOR) 運算,以產生密文。GCM 模式使用的加密編譯金鑰長度為 128 或 256 位元。

CBC 模式

CBC 會針對每個明文區塊與前一個密文區塊進行 XOR 運算,然後再進行加密,藉此「鏈接」區塊。CBC 模式使用的加密編譯金鑰長度為 128、192 或 256 位元。CBC 以 16 位元組初始向量做為初始區塊,並針對這個初始區塊與第一個明文區塊進行 XOR 運算。

額外資料

AEAD 加密函式支援使用 additional_data 引數,此引數也稱為相關聯的資料 (AD) 或其他已驗證資料。與金鑰組不同,這些額外資料本身不會解密產生的密文。額外資料可確保加密資料的真實性和完整性,但不保證其機密性。

例如,當您為特定客戶加密資料時,additional_data 可以做為 CAST(customer_id AS STRING) 的輸出。如此能確保解密資料前,已先使用預期的 customer_id 進行加密。解密時須使用相同的 additional_data 值。詳情請參閱 RFC 5116

解密

AEAD.ENCRYPT 的輸出是密文 BYTESAEAD.DECRYPT_STRINGAEAD.DECRYPT_BYTES 函式可以將此密文解密。這些函式使用的金鑰組必須包含用來加密的金鑰,且該金鑰必須處於 'ENABLED' 狀態。此外,這些函式還必須使用加密時所用的相同 additional_data

使用金鑰組進行解密時,系統會根據在密文中編碼的金鑰 ID 選擇適當的金鑰進行解密。

AEAD.DECRYPT_STRING 的輸出是明文 STRING,而 AEAD.DECRYPT_BYTES 的輸出是明文 BYTESAEAD.DECRYPT_STRING 可以解密編碼 STRING 值的密文,AEAD.DECRYPT_BYTES 則可以解密編碼 BYTES 值的密文。若使用上述其中一個函式針對編碼錯誤資料類型的密文進行解密 (例如使用 AEAD.DECRYPT_STRING 解密編碼 BYTES 值的密文),會產生未定義的行為,並可能導致錯誤發生。

金鑰輪替

輪替加密金鑰的主要目的,是減少使用任何特定金鑰加密的資料量。如此一來,即使金鑰遭盜用,攻擊者所能存取的資料也會比較少。

金鑰組輪替包含以下作業:

  1. 在每個金鑰組中建立新的主要加密編譯金鑰。
  2. 解密並重新加密所有已加密資料。

KEYS.ROTATE_KEYSET 函式會執行第一個步驟,將新的主要加密編譯金鑰新增至金鑰組,並將原本的主要加密編譯金鑰變更為次要加密編譯金鑰。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁