En esta página, se explica cómo usar los campos en la API de 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. Estos lineamientos complementan las formas en que Google Cloud protege automáticamente tus datos en reposo y en tránsito.
Protección automática de datos
Todos los datos en Google Cloud se encriptan automáticamenteen tránsito yen reposo dentro deGoogle Cloud.
Cloud KMS toma medidas adicionales para proteger las claves de encriptación en reposo. Para ello, encripta cada clave de encriptación con otra clave criptográfica llamada clave de encriptación de claves (KEK). Para obtener más información sobre esta técnica, consulta Encriptación de sobre.
Cada operación criptográfica de Cloud KMS incluye verificaciones automáticas de corrupción de datos. Si se detecta corrupción, se anula la operación y se registra un error detallado.
Estas protecciones automáticas son importantes, pero no evitan la corrupción de datos del cliente. Por ejemplo, el daño de datos durante la encriptación puede generar datos que no se pueden desencriptar.
En este tema, se analizan las formas de detectar y prevenir el daño de datos del cliente para minimizar el riesgo de pérdida de datos.
Cómo calcular y verificar sumas de verificación
La solicitud y la respuesta de cada operación criptográfica incluyen campos de suma de verificación CRC32C, como plaintext_crc32c
. Puedes calcular la suma de verificación y comparar los valores calculados y los que se devolvieron.
En el servidor, la API de Cloud Key Management Service establece campos booleanos, como verified_plaintext_crc32c
, en true
para indicar que recibió la suma de verificación pertinente y muestra un error INVALID_ARGUMENT
si la suma de verificación no coincide con el valor calculado por el servidor.
Ten en cuenta los siguientes lineamientos cuando calcules y compares sumas de verificación:
- Calcula las sumas de verificación con una codificación binaria tan pronto como se envían o reciben los datos.
- No almacenes sumas de verificación de texto sin formato sin encriptar en la API de Cloud Key Management Service ni desde ella. Por ejemplo, no almacene el contenido sin encriptar de los campos
EncryptRequest.plaintext_crc32c
oDecryptResponse.plaintext_crc32c
. Para mantener un registro de una suma de verificación, serialízala junto con los datos pertinentes y pasa el objeto compuesto a Cloud KMS para su encriptación. Cuando descifras datos, puedes verificar la suma de verificación con el valor esperado calculado. - Si una operación de desencriptación genera sumas de verificación que no coinciden, diseña tu aplicación para que vuelva a intentar la operación una cantidad limitada de veces, en caso de problemas transitorios.
- Si una operación de encriptación genera sumas de verificación que no coinciden para los datos encriptados (el texto cifrado), descarta el resultado encriptado y vuelve a intentarlo.
Para las solicitudes de encriptación, haz lo siguiente:
Si incluyes el campo de suma de verificación en la solicitud, el servidor establece un campo de verificación relacionado en la respuesta en
true
para indicar que recibió la suma de verificación y que intentó verificar su valor.Si incluyes el campo de suma de verificación, pero la respuesta establece el campo de verificación en
false
, significa que el servidor no recibió el campo de suma de verificación y es posible que falte otra información en la respuesta. Reintenta la solicitud una cantidad limitada de veces en caso de que el error sea transitorio.Si se recibió la suma de verificación, pero no coincidió, se devuelve un error
INVALID_ARGUMENT
. El error incluye el nombre del campo y la suma de verificación que no coincidió. Por ejemplo:The checksum in field plaintext_crc32c did not match the data in field plaintext.
Reintenta la solicitud una cantidad limitada de veces en caso de que el error sea transitorio.
Para las solicitudes de desencriptación, puedes calcular una suma de verificación y compararla con el valor de DecryptResponse.plaintext_crc32c
en la respuesta.
Los siguientes campos de suma de verificación se incluyen en las solicitudes a la API de Cloud Key Management Service y en las respuestas de esta.
Campo en la solicitud | Campo en la 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 | GetPublicKeyResponse.public_key.crc32c_checksum |
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 |
DecapsulateRequest.ciphertext_crc32c |
DecapsulateResponse.verified_ciphertext_crc32c |
No aplicable | DecapsulateResponse.shared_secret_crc32c |
Cómo verificar los nombres de los recursos
Las respuestas de Encrypt, GetPublicKey, AsymmetricSign, AsymmetricDecrypt, Decapsulate, MacSign y MacVerify incluyen un campo name
que contiene el nombre del objeto de la API de Cloud Key Management Service pertinente. 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 verificar cada tipo de datos relacionados con las operaciones criptográficas y cuándo verificar los datos de cada tipo de fuente. También puedes ver un resumen de los campos de verificación de datos.
Resumen de los campos de verificación de datos
Usa estas tablas cuando diseñes tu aplicación para determinar qué campos puedes usar para verificar tus datos antes y después de cada operación criptográfica.
Encrypt
API | Verificación de entrada del servidor | Verificación de recursos del cliente | Verificación de la salida del cliente | Verificación del lado del cliente de la entrada del servidor |
---|---|---|---|---|
EncryptRequest |
plaintext_crc32c , additional_authenticated_data_crc32c |
|||
EncryptResponse |
name |
ciphertext_crc32c |
verified_plaintext_crc32c , verified_additional_authenticated_data_crc32c |
Decrypt
API | Verificación de entrada del servidor | Verificación de recursos del cliente | Verificación de la salida del cliente | Verificación del lado del cliente de la entrada del servidor |
---|---|---|---|---|
DecryptRequest |
ciphertext_crc32c , additional_authenticated_data_crc32c |
|||
DecryptResponse |
plaintext_crc32c |
AsymmetricSign
API | Verificación de entrada del servidor | Verificación de recursos del cliente | Verificación de la salida del cliente | Verificación del lado del cliente de la entrada del servidor |
---|---|---|---|---|
AsymmetricSignRequest |
digest_crc32c |
|||
AsymmetricSignResponse |
name |
signature_crc32c |
verified_digest_crc32c |
AsymmetricDecrypt
API | Verificación de entrada del servidor | Verificación de recursos del cliente | Verificación de la salida del cliente | Verificación del lado del cliente de la entrada del servidor |
---|---|---|---|---|
AsymmetricDecryptRequest |
ciphertext_crc32c |
|||
AsymmetricDecryptResponse |
plaintext_crc32c |
verified_ciphertext_crc32c |
Decapsulate
API | Verificación de entrada del servidor | Verificación de recursos del cliente | Verificación de la salida del cliente | Verificación del lado del cliente de la entrada del servidor |
---|---|---|---|---|
DecapsulateRequest |
ciphertext_crc32c |
|||
DecapsulateResponse |
shared_secret_crc32c |
verified_ciphertext_crc32c |
PublicKey
API | Verificación de entrada del servidor | Verificación de recursos del cliente | Verificación de la salida del cliente | Verificación del lado del cliente de la entrada del servidor |
---|---|---|---|---|
PublicKey |
name |
pem_crc32c, public_key.crc32c_checksum |
MacSign
API | Verificación de entrada del servidor | Verificación de recursos del cliente | Verificación de la salida del cliente | Verificación del lado del cliente de la entrada del servidor |
---|---|---|---|---|
MacSignRequest |
data_crc32c |
|||
MacSignResponse |
mac_crc32c |
verified_data_crc32c |
MacVerify
API | Verificación de entrada del servidor | Verificación de recursos del cliente | Verificación de la salida del cliente | Verificación del lado del cliente de la entrada del servidor | |
---|---|---|---|---|---|
MacVerifyRequest |
data_crc32c |
mac_crc32c |
|||
MacVerifyResponse |
verified_data_crc32c |
verified_mac_crc32c |
verified_success_integrity |
¿Qué sigue?
- Más información sobre la encriptación simétrica y asimétrica
- Obtén más información para encriptar datos de aplicaciones
- Usa Registros de auditoría de Cloud