Como verificar a integridade completa dos dados

Nesta página, discutimos o uso de campos na API Cloud Key Management Service para detectar e impedir alterações de dados não intencionais durante a transferência entre os sistemas de clientes e o Cloud KMS. Essas diretrizes complementam as maneiras de o Google Cloud proteger dados em repouso e em trânsito automaticamente.

Proteção de dados automática

Todos os dados no Google Cloud são automaticamente criptografados em trânsito e em repouso no Google Cloud.

O Cloud KMS executa etapas extras para proteger chaves de criptografia em repouso. Para isso, ele criptografa cada chave de criptografia usando outra chave de criptografia de chaves (KEK). Para saber mais sobre essa técnica, consulte a criptografia de envelope.

Cada operação criptográfica do Cloud KMS inclui verificações automáticas para corrupção de dados. Se a corrupção for detectada, a operação será cancelada e um erro detalhado será registrado.

Essas proteções automáticas são importantes, mas não impedem a corrupção de dados do lado do cliente. Por exemplo, a corrupção de dados durante a criptografia pode levar a dados que não podem ser descriptografados.

Este tópico discute maneiras de detectar e evitar a corrupção de dados do cliente para minimizar o risco de perda de dados.

Como calcular e verificar somas de verificação

Cada solicitação e resposta de operação criptográfica inclui campos de soma de verificação CRC32C (em inglês), como plaintext_crc32c. Calcule a soma de verificação e compare os valores calculados e retornados.

No servidor, a API Cloud Key Management Service define campos booleanos, como verified_plaintext_crc32c, para true para indicar que recebeu a soma de verificação relevante. Em seguida, retorna um erro INVALID_ARGUMENT se a soma de verificação não corresponder ao valor calculado pelo servidor.

Considere as seguintes diretrizes ao calcular e comparar somas de verificação:

  • Calcule somas de verificação usando uma codificação binária assim que os dados forem enviados ou recebidos.
  • Não armazene somas de verificação em texto simples não criptografadas de ou para a API Cloud Key Management Service. Por exemplo, não armazene o conteúdo não criptografado dos campos EncryptRequest.plaintext_crc32c ou DecryptResponse.plaintext_crc32c. Para manter um registro de uma soma de verificação, serialize-o com os dados relevantes e passe o objeto composto para o Cloud KMS para criptografia. Ao descriptografar dados, é possível verificar a soma de verificação em relação ao valor esperado calculado.
  • Se uma operação de descriptografia resultar em somas de verificação incompatíveis, configure o aplicativo para repetir a operação por um número limitado de vezes, em caso de problemas temporários.
  • Se uma operação de criptografia resultar em somas de verificação incompatíveis com os dados criptografados (texto criptografado), descarte o resultado e tente novamente.

Para solicitações de criptografia:

  • Se você incluir o campo de soma de verificação na solicitação, o servidor definirá um campo de verificação como true relacionado na resposta para indicar que ele recebeu a soma de verificação e tentou verificar o valor.

  • Se você incluir o campo de soma de verificação, mas a resposta definir o campo de verificação como false, significa que o servidor não recebeu o campo de soma de verificação, e outras informações podem estar ausentes na resposta. Repita a solicitação um número limitado de vezes caso o erro seja temporário.

  • Se a soma de verificação foi recebida, mas não encontrou correspondência, ela retornará um erro INVALID_ARGUMENT. Ele inclui o nome do campo e a soma de verificação que não encontrou correspondência. Exemplo:

    The checksum in field plaintext_crc32c did not match the data in field plaintext.
    

    Repita a solicitação um número limitado de vezes caso o erro seja temporário.

Para solicitações de descriptografia, calcule uma soma de verificação e compare-a com o valor de DecryptResponse.plaintext_crc32c na resposta.

Os campos de soma de verificação a seguir estão incluídos nas solicitações e respostas da API Cloud Key Management Service.

Campo na solicitação Campo na resposta
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
Não relevante DecryptResponse.plaintext_crc32c
MacSignRequest.data_crc32c MacSignResponse.verified_data_crc32c
MacVerifyRequest.data_crc32c MacVerifyResponse.verified_data_crc32c
MacVerifyRequest.mac_crc32c MacVerifyResponse.verified_mac_crc32c
Não relevante MacVerifyResponse.verified_success_integrity

Como verificar nomes de recursos

Respostas para Encrypt, GetPublicKey, AsymmetricSign, MacSign, e MacVerify, inclua um campo name que contém o nome do objeto relevante da API Cloud Key Management Service. É possível comparar o valor do campo name com o valor esperado e descartar resultados que não correspondem.

Diagrama de verificação de dados

Este diagrama mostra quando verificar cada tipo de dados relacionados a operações criptográficas e quando verificar dados de cada tipo de origem. Também é possível ver um resumo dos campos de verificação de dados.

Diagrama mostrando campos de verificação de dados diferentes e as ações às quais eles correspondem

Resumo do campo de verificação de dados

Use essas tabelas ao projetar seu aplicativo para determinar quais campos podem ser usados a fim de verificar os dados antes e depois de cada operação criptográfica.

Encrypt

API Verificação de entrada do lado do servidor Verificação de recursos do lado do cliente Verificação da saída do lado do cliente Verificação do lado do cliente da entrada do lado do servidor
EncryptRequest plaintext_crc32c, additional_authenticated_data_crc32c
EncryptResponse name ciphertext_crc32c verified_plaintext_crc32c, verified_additional_authenticated_data_crc32c

Decrypt

API Verificação de entrada do lado do servidor Verificação de recursos do lado do cliente Verificação da saída do lado do cliente Verificação do lado do cliente da entrada do lado do servidor
DecryptRequest ciphertext_crc32c, additional_authenticated_data_crc32c
DecryptResponse plaintext_crc32c

AsymmetricSign

API Verificação de entrada do lado do servidor Verificação de recursos do lado do cliente Verificação da saída do lado do cliente Verificação do lado do cliente da entrada do lado do servidor
AsymmetricSignRequest digest_crc32c
AsymmetricSignResponse name signature_crc32c verified_digest_crc32c

AsymmetricDecrypt

API Verificação de entrada do lado do servidor Verificação de recursos do lado do cliente Verificação da saída do lado do cliente Verificação do lado do cliente da entrada do lado do servidor
AsymmetricDecryptRequest ciphertext_crc32c
AsymmetricDecryptResponse plaintext_crc32c verified_ciphertext_crc32c

PublicKey

API Verificação de entrada do lado do servidor Verificação de recursos do lado do cliente Verificação da saída do lado do cliente Verificação do lado do cliente da entrada do lado do servidor
PublicKey name pem_crc32c

MacSign

API Verificação de entrada do lado do servidor Verificação de recursos do lado do cliente Verificação da saída do lado do cliente Verificação do lado do cliente da entrada do lado do servidor
MacSignRequest data_crc32c
MacSignResponse mac_crc32c verified_data_crc32c

MacVerify

API Verificação de entrada do lado do servidor Verificação de recursos do lado do cliente Verificação da saída do lado do cliente Verificação do lado do cliente da entrada do lado do servidor
MacVerifyRequest data_crc32c mac_crc32c
MacVerifyResponse verified_data_crc32c verified_mac_crc32c verified_success_integrity

A seguir