AEAD 암호화 개념

BigQuery용 GoogleSQL은 연관 데이터로 인증 암호화(AEAD)를 지원합니다.

이 주제에서는 GoogleSQL의 AEAD 암호화에 대한 개념을 설명합니다. GoogleSQL이 지원하는 다양한 AEAD 암호화에 대한 설명은 AEAD 암호화 함수에서 확인할 수 있습니다.

AEAD 암호화의 목적

BigQuery는 저장 데이터 암호화를 사용하여 데이터를 안전하게 보호합니다. 또한 고객 관리형 암호화 키(CMEK)를 지원하므로 사용자가 특정 암호화 키를 사용하여 테이블을 암호화할 수 있습니다. 하지만 경우에 따라 사용자는 테이블 내의 개별 값을 암호화해야 할 수 있습니다.

예를 들어 모든 고객의 데이터를 공통 테이블에 보관하고 다른 키를 사용하여 각 고객의 데이터를 암호화하려고 합니다. '암호-삭제'를 수행할 수 있도록 여러 테이블에 분산된 데이터가 있습니다. 암호-삭제 또는 암호-파쇄는 암호화 키를 삭제하여 해당 키로 암호화된 모든 데이터를 읽을 수 없게 만드는 프로세스입니다.

AEAD 암호화 기능을 사용하면 암호화 및 복호화용 키를 포함하는 키 세트를 만들 수 있으며, 이 키를 사용하여 테이블의 개별 값을 암호화 및 복호화하고 키 세트 내에서 키를 순환시킬 수 있습니다.

키 세트

키 세트는 암호화 키 모음으로, 그 중 하나는 기본 암호화 키이고 나머지는 보조 암호화 키입니다. 각 키는 키의 사용 여부, 사용 중지 여부, 폐기 여부, 폐기되지 않은 키의 경우 키 바이트 등에 관계없이 암호화 또는 복호화 알고리즘을 인코딩합니다. 기본 암호화 키는 입력된 일반 텍스트를 암호화하는 방법을 결정합니다. 기본 암호화 키는 사용 중지된 상태가 될 수 없습니다. 보조 암호화 키는 복호화 목적으로만 사용되며 사용 상태이거나 사용 중지 상태일 수 있습니다. 키 세트를 사용하여 암호화에 사용된 모든 데이터의 암호를 복호화할 수 있습니다.

GoogleSQL의 키 세트는 BYTES의 직렬화된 google.crypto.tink.Keyset 프로토콜 버퍼로 표현됩니다.

예시

다음은 세 개의 키가 있는 AEAD 키 세트의 예시입니다(JSON 문자열로 표시됨).

{
  "primaryKeyId": 569259624,
  "key": [
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "GiDPhTp5gIhfnDb6jfKOT4SmNoriIJc7ah8uRvrCpdNihA==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "ENABLED",
      "keyId": 569259624,
      "outputPrefixType": "TINK"
    },
    {
      "keyData": {
        "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
        "value": "GiBp6aU2cFbVfTh9dTQ1F0fqM+sGHXc56RDPryjAnzTe2A==",
        "keyMaterialType": "SYMMETRIC"
      },
      "status": "DISABLED",
      "keyId": 852264701,
      "outputPrefixType": "TINK"
    },
    {
      "status": "DESTROYED",
      "keyId": 237910588,
      "outputPrefixType": "TINK"
    }
  ]
}

위의 예시에서 569259624 ID가 있는 기본 암호화 키는 JSON 문자열에 나열된 첫 번째 키입니다. 보조 암호화 키는 두 가지가 있으며 ID가 852264701인 사용 중지 상태의 키와 ID가 237910588인 폐기 상태의 키입니다. AEAD 암호화 함수가 이 키 세트를 암호화에 사용하면 최종 암호문은 569259624라는 기본 암호화 키의 ID를 암호화합니다.

AEAD 함수가 이 키 세트를 복호화에 사용하면 함수는 암호문에 인코딩된 키 ID를 기반으로 복호화에 적합한 키를 선택합니다. 위의 예시에서 키 ID 852264701 또는 237910588을 사용하여 복호화하려고 하면 키 ID 852264701이 사용 중지되고 ID 237910588이 폐기되므로 오류가 발생합니다. 키 ID 852264701을 사용 상태로 복원하면 복호화에 사용할 수 있도록 렌더링됩니다.

키 유형은 해당 키에 사용할 암호화 모드를 결정합니다.

동일한 키 세트를 사용하여 두 번 이상 일반 텍스트를 암호화하면 OpenSSL에서 제공하는 의사 난수 생성기를 사용하여 선택한 서로 다른 초기화 벡터(IV)로 인해 다른 암호문 값이 반환됩니다.

래핑된 키 세트

키 세트를 안전하게 관리하거나 신뢰할 수 없는 채널을 통해 전송해야 하는 경우 래핑된 키 세트를 사용하는 것이 좋습니다. 원시 키 세트를 래핑하면 이 프로세스는 Cloud KMS 키를 사용하여 원시 키 세트를 암호화합니다.

래핑된 키 세트는 키 세트 데이터를 노출하지 않고도 데이터를 암호화 및 복호화할 수 있습니다. 다른 방법으로 필드 수준 데이터에 대한 액세스를 제한할 수도 있지만 래핑된 키 세트는 원시 키 세트보다 키 세트를 안전하게 관리할 수 있는 메커니즘을 제공합니다.

키 세트와 마찬가지로 래핑된 키 세트도 주기적으로 순환할 수 있으며 순환해야 합니다. 래핑된 키 세트는 AEAD 엔벨로프 암호화 함수에서 사용됩니다.

다음은 래핑된 키 세트 예시가 있는 몇 가지 함수입니다.

고급 암호화 표준(AES)

AEAD 암호화 함수고급 암호화 표준(AES) 암호화를 사용합니다. AES 암호화는 암호 키와 함께 일반 텍스트를 입력으로 사용하고 암호화된 바이트 시퀀스를 출력으로 반환합니다. 이후 암호화하는 데 사용된 것과 동일한 키를 사용하여 이 바이트 시퀀스를 복호화할 수 있습니다. AES는 16바이트 블록 크기를 사용합니다. 즉, 일반 텍스트는 16바이트 블록의 시퀀스로 처리됩니다. 암호문에는 암호화를 수행하는 데 사용된 키를 나타내는 Tink 특정 프리픽스가 포함됩니다. AES 암호화는 다중 블록 암호화 모드를 지원합니다.

블록 암호화 모드

AEAD 암호화 함수에서 지원하는 두 개의 블록 암호화 모드는 GCM 및 CBC입니다.

GCM

Galois/Counter Mode(GCM)는 AES 암호화를 위한 모드입니다. 이 함수는 블록의 번호를 순차적으로 매긴 다음 이 블록 번호를 초기화 벡터(IV)와 결합합니다. 초기화 벡터는 무작위 또는 의사 난수 값으로, 일반 텍스트 데이터를 무작위 순서로 지정하기 위한 기반을 형성합니다. 다음으로 이 함수는 AES를 사용하여 결합된 블록 번호와 IV를 암호화합니다. 그런 다음 암호화 및 일반 텍스트 결과에 대해 비트 배타적 논리합(XOR) 연산을 수행하여 암호문을 생성합니다. GCM 모드는 128 또는 256비트의 암호화 키를 사용합니다.

CBC 모드

CBC는 암호화하기 전에 암호문 블록의 이전 블록과 일반 텍스트의 각 블록을 XOR 처리하여 블록을 '연결'합니다. CBC 모드는 128, 192 또는 256비트의 암호화 키를 사용합니다. CBC는 16바이트 초기화 벡터를 초기 블록으로 사용하고 이 블록을 첫 번째 일반 텍스트 블록과 XOR 처리합니다.

CBC 모드는 암호화 측면에서 AEAD 스키마가 아니므로 데이터 무결성을 제공하지 않습니다. 즉, 암호화된 데이터의 악의적 수정은 감지되지 않으므로 데이터 기밀 유지에도 취약합니다. 따라서 CBC는 기존 이유로 필요한 경우가 아니라면 권장되지 않습니다.

추가 데이터

AEAD 암호화 함수는 연결된 데이터(AD) 또는 추가 인증 데이터라고도 하는 additional_data 인수의 사용을 지원합니다. 암호문은 암호화에 사용된 것과 동일한 추가 데이터가 복호화에도 제공되는 경우에만 복호화될 수 있습니다. 따라서 추가 데이터를 사용하여 암호문을 컨텍스트에 바인딩할 수 있습니다.

예를 들어 특정 고객의 데이터를 암호화 할 때 additional_dataCAST(customer_id AS STRING)의 출력이 될 수 있습니다. 이는 이전에 예상 customer_id를 사용하여 암호화된 데이터가 복호화된다는 의미입니다. 복호화에는 동일한 additional_data 값이 필요합니다. 자세한 내용은 RFC 5116을 참조하세요.

복호화

AEAD.ENCRYPT의 출력은 암호문 BYTES입니다. AEAD.DECRYPT_STRING 또는 AEAD.DECRYPT_BYTES 함수는 이 암호문을 복호화할 수 있습니다. 이러한 함수는 암호화에 사용된 키가 포함되어 있는 키 세트를 사용해야 합니다. 이 키는 'ENABLED' 상태여야 합니다. 또한 암호화에 사용된 것과 동일한 additional_data를 사용해야 합니다.

키 세트가 복호화에 사용될 때 암호문에 인코딩된 키 ID를 기반으로 복호화에 적절한 키가 선택됩니다.

AEAD.DECRYPT_STRING의 출력은 일반 텍스트 STRING이지만 AEAD.DECRYPT_BYTES의 출력은 일반 텍스트 BYTES입니다. AEAD.DECRYPT_STRING는 STRING 값을 인코딩하는 암호문을 복호화할 수 있으며 AEAD.DECRYPT_BYTESBYTES 값을 인코딩하는 암호문을 복호화할 수 있습니다. 이러한 함수 중 하나를 사용하여 잘못된 데이터 유형을 인코딩하는 암호문을 복호화하면(예: AEAD.DECRYPT_STRING을 사용하여 BYTES 값을 인코딩하는 암호문 복호화), 정의되지 않은 동작이 발생하고 오류로 이어질 수 있습니다.

키 순환

암호화 키를 순환하는 주요 목적은 특정 키로 암호화된 데이터의 양을 줄이는 것이므로 잠재적으로 손상이 발생한 키를 통해 공격자가 액세스할 수 있는 데이터의 양을 제한할 수 있습니다.

키 세트 순환은 다음 항목을 포함합니다.

  1. 모든 키 세트 내에서 새로운 기본 암호화 키를 만듭니다.
  2. 암호화된 모든 데이터를 복호화하고 다시 암호화합니다.

KEYS.ROTATE_KEYSET 또는 KEYS.ROTATE_WRAPPED_KEYSET 함수는 키 세트에 새로운 기본 암호화 키를 추가하고 이전의 기본 암호화 키를 보조 암호화 키로 변경하여 첫 번째 단계를 수행합니다.

Cloud KMS 키

GoogleSQL에서는 Cloud KMS 키AEAD 암호화 함수를 지원하므로 데이터를 더욱 안전하게 보호할 수 있습니다. 이 추가 보호 레이어는 키 암호화 키(KEK)를 사용하여 데이터 암호화 키(DEK)를 암호화합니다. KEK는 Cloud Key Management Service에 안전하게 저장되고 Cloud KMS 권한과 역할로 관리되는 대칭 암호화 키 세트입니다.

쿼리 실행 시 KEYS.KEYSET_CHAIN 함수를 사용하여 KEK의 KMS 리소스 경로와 래핑된 DEK의 암호문을 제공합니다. BigQuery는 Cloud KMS를 호출하여 DEK를 래핑 해제한 다음 해당 키를 사용하여 쿼리의 데이터를 복호화합니다. 래핑 해제된 DEK 버전은 쿼리 기간에만 메모리에 저장된 후 폐기됩니다.

자세한 내용은 Cloud KMS 키를 사용한 SQL 열 수준 암호화를 참조하세요.