표준 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
}

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

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

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

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

고급 암호화 표준(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 처리합니다.

추가 데이터

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 함수는 키 세트에 새로운 기본 암호화 키를 추가하고 이전의 기본 암호화 키를 보조 암호화 키로 변경하여 첫 번째 단계를 수행합니다.