이 페이지에서는 Cloud Key Management Service API의 필드를 사용하여 클라이언트 시스템과 Cloud KMS 간에 데이터가 이동될 때 데이터 변경을 감지하고 의도치 않은 변경을 방지하는 방법을 설명합니다. 이 가이드라인은 Google Cloud가 저장 중인 데이터와 전송 중인 데이터를 자동으로 보호하는 방법에 대한 보충 설명입니다.
자동 데이터 보호
Google Cloud의 모든 데이터는 Google Cloud 내에서 전송 중 및 저장 중에 자동으로 암호화됩니다.
Cloud KMS는 키 암호화 키(KEK)라는 또 다른 암호화 키를 사용해서 각 암호화 키를 암호화여 저장 중인 암호화 키를 보호하는 추가 단계를 수행합니다. 이 기법에 대해 자세히 알아보려면 봉투 암호화를 참조하세요.
각 Cloud KMS 암호화 작업에는 데이터 손상에 대한 자동 확인이 포함됩니다. 손상이 감지되면 작업이 중단되고 자세한 오류가 로깅됩니다.
이러한 자동 보호가 중요하지만 클라이언트 측 데이터 손상을 방지하지는 않습니다. 예를 들어 암호화 중에 데이터가 손상되면 데이터를 복호화하지 못할 수 있습니다.
이 주제에서는 데이터 손실 위험을 최소화하기 위해 클라이언트 측 데이터 손상을 감지하고 방지하는 방법을 설명합니다.
체크섬 계산 및 확인
각 암호화 작업의 요청 및 응답에는 plaintext_crc32c
와 같은 CRC32C 체크섬 필드가 포함됩니다. 체크섬을 계산하고 계산된 값과 반환된 값을 비교할 수 있습니다.
서버에서 Cloud Key Management Service API는 관련 체크섬이 수신된 것을 나타내기 위해 verified_plaintext_crc32c
와 같은 부울 필드를 true
로 설정하고, 체크섬이 서버에서 계산된 값과 일치하지 않을 경우 INVALID_ARGUMENT
오류를 반환합니다.
체크섬을 계산하고 비교할 때는 다음 가이드라인에 유의하세요.
- 데이터가 전송되거나 수신되는 즉시 바이너리 인코딩을 사용하여 체크섬을 계산하세요.
- Cloud Key Management Service API에서 전송되거나 수신되는 암호화되지 않은 일반 텍스트 체크섬을 저장하지 마세요. 예를 들어
EncryptRequest.plaintext_crc32c
또는DecryptResponse.plaintext_crc32c
필드의 암호화되지 않은 내용을 저장하지 마세요. 체크섬 레코드를 보존하려면 관련 데이터와 함께 직렬화하고 복합 객체를 암호화하도록 Cloud KMS로 전달합니다. 데이터를 복호화할 때는 계산된 예상 값으로 체크섬을 확인할 수 있습니다. - 복호화 작업으로 일치하지 않는 체크섬이 발생하는 경우, 일시적인 문제일 수도 있으므로, 제한된 횟수만 작업을 재시도하도록 애플리케이션을 디자인합니다.
- 암호화 작업으로 암호화된 데이터(암호문)에 대해 일치하지 않는 체크섬이 발생하는 경우, 암호화된 결과를 버리고 다시 시도합니다.
암호화 요청의 경우:
요청에 체크섬 필드를 포함하면, 체크섬 수신과 해당 값 확인이 시도되었음을 나타내기 위해 서버가 응답에서 관련 확인 필드를
true
로 설정합니다.체크섬 필드를 포함하지만 응답이 확인 필드를
false
로 설정하는 경우, 서버가 체크섬 필드를 수신하지 않았거나 다른 정보가 응답에서 누락된 것일 수 있습니다. 일시적인 오류일 수도 있으므로 제한된 횟수만 요청을 재시도합니다.체크섬이 수신되었지만 일치하지 않으면
INVALID_ARGUMENT
오류가 반환됩니다. 오류에는 일치하지 않은 필드 및 체크섬 이름이 포함됩니다. 예를 들면 다음과 같습니다.The checksum in field plaintext_crc32c did not match the data in field plaintext.
일시적인 오류일 수도 있으므로 제한된 횟수만 요청을 재시도합니다.
복호화 요청의 경우 체크섬을 계산하고 이를 응답의 DecryptResponse.plaintext_crc32c
값과 비교할 수 있습니다.
다음 체크섬 필드는 Cloud Key Management Service API에 대한 요청 및 응답에 포함됩니다.
요청의 필드 | 응답의 필드 |
---|---|
EncryptRequest.plaintext_crc32c |
EncryptResponse.verified_plaintext_crc32c |
EncryptionRequest.additional_authenticated_data_crc32c |
EncryptionResponse.verified_additional_authenticated_data_crc32c |
AsymmetricSignRequest.digest_crc32c |
AsymmetricSignResponse.verified_digest_crc32c |
AsymmetricSignRequest.signature_crc32c |
AsymmetricSignResponse.verified_signature_crc32c |
AsymmetricSignRequest.signature_crc32c |
AsymmetricSignResponse.verified_signature_crc32c |
해당 없음 | GetPublicKeyResponse.pem_crc32c |
해당 없음 | DecryptResponse.plaintext_crc32c |
MacSignRequest.data_crc32c |
MacSignResponse.verified_data_crc32c |
MacVerifyRequest.data_crc32c |
MacVerifyResponse.verified_data_crc32c |
MacVerifyRequest.mac_crc32c |
MacVerifyResponse.verified_mac_crc32c |
해당 없음 | MacVerifyResponse.verified_success_integrity |
리소스 이름 확인
Encrypt, GetPublicKey, AsymmetricSign, MacSign, MacVerify 응답에는 관련 Cloud Key Management Service API 객체의 이름이 포함된 name
필드가 있습니다. name
필드의 값을 예상한 값과 비교하고 일치하지 않는 결과를 삭제할 수 있습니다.
데이터 확인 다이어그램
이 다이어그램은 암호화 작업과 관련된 각 데이터 유형을 확인할 때와 각 소스 유형의 데이터를 확인할 때를 보여줍니다. 또한 데이터 확인 필드 요약을 볼 수 있습니다.
데이터 확인 필드 요약
애플리케이션을 디자인할 때 이 테이블을 사용하여 각 암호화 작업의 전후에 데이터를 확인하는 데 사용할 수 있는 필드를 결정합니다.
암호화
API | 서버 측 입력 확인 | 클라이언트 측 리소스 확인 | 클라이언트 측 출력 확인 | 서버 측 입력의 클라이언트 측 확인 |
---|---|---|---|---|
EncryptRequest |
plaintext_crc32c , additional_authenticated_data_crc32c |
|||
EncryptResponse |
name |
ciphertext_crc32c |
verified_plaintext_crc32c , verified_additional_authenticated_data_crc32c |
복호화
API | 서버 측 입력 확인 | 클라이언트 측 리소스 확인 | 클라이언트 측 출력 확인 | 서버 측 입력의 클라이언트 측 확인 |
---|---|---|---|---|
DecryptRequest |
ciphertext_crc32c , additional_authenticated_data_crc32c |
|||
DecryptResponse |
plaintext_crc32c |
AsymmetricSign
API | 서버 측 입력 확인 | 클라이언트 측 리소스 확인 | 클라이언트 측 출력 확인 | 서버 측 입력의 클라이언트 측 확인 |
---|---|---|---|---|
AsymmetricSignRequest |
digest_crc32c |
|||
AsymmetricSignResponse |
name |
signature_crc32c |
verified_digest_crc32c |
AsymmetricDecrypt
API | 서버 측 입력 확인 | 클라이언트 측 리소스 확인 | 클라이언트 측 출력 확인 | 서버 측 입력의 클라이언트 측 확인 |
---|---|---|---|---|
AsymmetricDecryptRequest |
ciphertext_crc32c |
|||
AsymmetricDecryptResponse |
plaintext_crc32c |
verified_ciphertext_crc32c |
PublicKey
API | 서버 측 입력 확인 | 클라이언트 측 리소스 확인 | 클라이언트 측 출력 확인 | 서버 측 입력의 클라이언트 측 확인 |
---|---|---|---|---|
PublicKey |
name |
pem_crc32c |
MacSign
API | 서버 측 입력 확인 | 클라이언트 측 리소스 확인 | 클라이언트 측 출력 확인 | 서버 측 입력의 클라이언트 측 확인 |
---|---|---|---|---|
MacSignRequest |
data_crc32c |
|||
MacSignResponse |
mac_crc32c |
verified_data_crc32c |
MacVerify
API | 서버 측 입력 확인 | 클라이언트 측 리소스 확인 | 클라이언트 측 출력 확인 | 서버 측 입력의 클라이언트 측 확인 | |
---|---|---|---|---|---|
MacVerifyRequest |
data_crc32c |
mac_crc32c |
|||
MacVerifyResponse |
verified_data_crc32c |
verified_mac_crc32c |
verified_success_integrity |
다음 단계
- 대칭 및 비대칭 암호화 자세히 알아보기
- 애플리케이션 데이터 암호화 자세히 알아보기
- Cloud 감사 로그 사용