엔드 투 엔드 데이터 무결성 확인

이 페이지에서는 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
GetPublicKeyRequest.pem_crc32c GetPublicKeyResponse.verified_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

다음 단계