Verificar la integridad de datos completa

En esta página se explica cómo usar los campos de la API Cloud Key Management Service para detectar y evitar cambios no deseados en los datos a medida que se mueven entre los sistemas cliente y Cloud KMS. Estas directrices complementan las formas en las que Google Cloud protege automáticamente tus datos en reposo y en tránsito.

Protección de datos automática

Todos los datos de Google Cloud se cifran automáticamente en tránsito y en reposo en Google Cloud.

Cloud KMS toma medidas adicionales para proteger las claves de encriptado en reposo. Para ello, encripta cada clave de encriptado con otra clave criptográfica llamada clave de encriptado de claves (KEK). Para obtener más información sobre esta técnica, consulta el artículo sobre el cifrado de envolvente.

Cada operación criptográfica de Cloud KMS incluye comprobaciones automáticas de corrupción de datos. Si se detecta corrupción, la operación se cancela y se registra un error detallado.

Estas protecciones automáticas son importantes, pero no evitan que los datos se dañen en el lado del cliente. Por ejemplo, si los datos se dañan durante el cifrado, no se podrán descifrar.

En este tema se describen formas de detectar y evitar que se dañen los datos del lado del cliente para minimizar el riesgo de pérdida de datos.

Calcular y verificar sumas de comprobación

La solicitud y la respuesta de cada operación criptográfica incluyen campos de suma de comprobación CRC32C, como plaintext_crc32c. Puedes calcular la suma de comprobación y comparar los valores calculados y devueltos.

En el servidor, la API Cloud Key Management Service asigna el valor true a los campos booleanos, como verified_plaintext_crc32c, para indicar que ha recibido la suma de comprobación correspondiente y devuelve un error INVALID_ARGUMENT si la suma de comprobación no coincide con el valor calculado por el servidor.

Ten en cuenta las siguientes directrices al calcular y comparar sumas de comprobación:

  • Calcula las sumas de comprobación con una codificación binaria en cuanto se envíen o reciban los datos.
  • No almacenes sumas de comprobación de texto sin cifrar en la API de Cloud Key Management Service ni desde ella. Por ejemplo, no almacenes el contenido sin cifrar de los campos EncryptRequest.plaintext_crc32c o DecryptResponse.plaintext_crc32c. Para mantener un registro de una suma de comprobación, serialízala junto con los datos pertinentes y envía el objeto compuesto a Cloud KMS para que lo cifre. Cuando descifre datos, podrá verificar la suma de comprobación con el valor esperado que haya calculado.
  • Si una operación de descifrado da como resultado sumas de comprobación que no coinciden, diseña tu aplicación para que vuelva a intentar la operación un número limitado de veces en caso de que haya problemas transitorios.
  • Si una operación de cifrado da como resultado sumas de comprobación no coincidentes para los datos cifrados (el texto cifrado), descarta el resultado cifrado y vuelve a intentarlo.

Para las solicitudes de cifrado:

  • Si incluye el campo de suma de comprobación en la solicitud, el servidor asigna el valor true a un campo de verificación relacionado en la respuesta para indicar que ha recibido la suma de comprobación y ha intentado verificar su valor.

  • Si incluye el campo de suma de comprobación, pero la respuesta asigna el valor false al campo de verificación, significa que el servidor no ha recibido el campo de suma de comprobación y que puede que falte otra información en la respuesta. Vuelve a intentar enviar la solicitud un número limitado de veces por si el error es transitorio.

  • Si se ha recibido la suma de comprobación, pero no coincide, se devuelve un error INVALID_ARGUMENT. El error incluye el nombre del campo y la suma de comprobación que no coincide. Por ejemplo:

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

    Vuelve a intentar enviar la solicitud un número limitado de veces por si el error es transitorio.

En el caso de las solicitudes de descifrado, puedes calcular una suma de comprobación y compararla con el valor de DecryptResponse.plaintext_crc32c en la respuesta.

Los siguientes campos de suma de comprobación se incluyen en las solicitudes y respuestas de la API de Cloud Key Management Service.

Campo de la solicitud Campo de respuesta
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
No aplicable GetPublicKeyResponse.pem_crc32c
No aplicable DecryptResponse.plaintext_crc32c
MacSignRequest.data_crc32c MacSignResponse.verified_data_crc32c
MacVerifyRequest.data_crc32c MacVerifyResponse.verified_data_crc32c
MacVerifyRequest.mac_crc32c MacVerifyResponse.verified_mac_crc32c
No aplicable MacVerifyResponse.verified_success_integrity

Verificar nombres de recursos

Las respuestas de Encrypt, GetPublicKey, AsymmetricSign, MacSign, y MacVerify, incluyen un campo name que contiene el nombre del objeto de la API de Cloud Key Management Service correspondiente. Puedes comparar el valor del campo name con el valor que esperas y descartar los resultados que no coincidan.

Diagrama de verificación de datos

En este diagrama se muestra cuándo se debe verificar cada tipo de datos relacionados con las operaciones criptográficas y cuándo se deben verificar los datos de cada tipo de fuente. También puedes ver un resumen de los campos de verificación de datos.

Diagrama que muestra los diferentes campos de verificación de datos y las acciones a las que corresponden

Resumen de los campos de verificación de datos

Usa estas tablas al diseñar tu aplicación para determinar qué campos puedes usar para verificar tus datos antes y después de cada operación criptográfica.

Cifrar

API Verificación de entradas del lado del servidor Verificación de recursos del lado del cliente Verificación de la salida del lado del cliente Verificación del lado del cliente de las entradas del lado del servidor
EncryptRequest plaintext_crc32c, additional_authenticated_data_crc32c
EncryptResponse name ciphertext_crc32c verified_plaintext_crc32c, verified_additional_authenticated_data_crc32c

Descifrar

API Verificación de entradas del lado del servidor Verificación de recursos del lado del cliente Verificación de la salida del lado del cliente Verificación del lado del cliente de las entradas del lado del servidor
DecryptRequest ciphertext_crc32c, additional_authenticated_data_crc32c
DecryptResponse plaintext_crc32c

AsymmetricSign

API Verificación de entradas del lado del servidor Verificación de recursos del lado del cliente Verificación de la salida del lado del cliente Verificación del lado del cliente de las entradas del lado del servidor
AsymmetricSignRequest digest_crc32c
AsymmetricSignResponse name signature_crc32c verified_digest_crc32c

AsymmetricDecrypt

API Verificación de entradas del lado del servidor Verificación de recursos del lado del cliente Verificación de la salida del lado del cliente Verificación del lado del cliente de las entradas del lado del servidor
AsymmetricDecryptRequest ciphertext_crc32c
AsymmetricDecryptResponse plaintext_crc32c verified_ciphertext_crc32c

PublicKey

API Verificación de entradas del lado del servidor Verificación de recursos del lado del cliente Verificación de la salida del lado del cliente Verificación del lado del cliente de las entradas del lado del servidor
PublicKey name pem_crc32c

MacSign

API Verificación de entradas del lado del servidor Verificación de recursos del lado del cliente Verificación de la salida del lado del cliente Verificación del lado del cliente de las entradas del lado del servidor
MacSignRequest data_crc32c
MacSignResponse mac_crc32c verified_data_crc32c

MacVerify

API Verificación de entradas del lado del servidor Verificación de recursos del lado del cliente Verificación de la salida del lado del cliente Verificación del lado del cliente de las entradas del lado del servidor
MacVerifyRequest data_crc32c mac_crc32c
MacVerifyResponse verified_data_crc32c verified_mac_crc32c verified_success_integrity

Siguientes pasos