Para validar la integridad de los datos y detectar cambios, Cloud Storage te recomienda que uses sumas de comprobación cuando transfieras datos a tus buckets y desde ellos. En esta página, se proporciona información sobre cómo se usan las sumas de comprobación en Cloud Storage y cómo especificarlas cuando se envían solicitudes.
Evita la corrupción de datos con sumas de comprobación
A veces, los datos pueden dañarse mientras se transfieren a la nube o desde ella debido a errores de software o hardware, errores de memoria o de router, perturbaciones eléctricas o cambios en los datos de origen durante las cargas de archivos de períodos prolongados.
Para protegerte contra la corrupción de datos, Cloud Storage admite el uso de sumas de comprobación CRC32C y MD5 para verificar la integridad de tus datos y detectar cambios en ellos.
CRC32C es el método de validación recomendado para realizar verificaciones de integridad. La validación con hashes MD5 se admite para cargas de un solo archivo, pero no se admite para objetos que se suben en partes, como objetos compuestos y objetos subidos con una carga multiparte de la API de XML.
Sumas de comprobación para escrituras de datos
Para las escrituras de objetos, el cliente calcula la suma de comprobación del archivo local y la adjunta a los encabezados HTTP de la solicitud de carga de objetos. El servidor
recibe la carga útil de datos, calcula su propia suma de comprobación y
valida los datos comparando ambas sumas de comprobación después de que se completa la carga.
Si las sumas de comprobación coinciden, el objeto se almacena en Cloud Storage junto con sus sumas de comprobación. Si las sumas de comprobación no coinciden, la solicitud de escritura se rechaza con un error BadRequestException: 400.
Validación del servidor para escrituras de datos
Cloud Storage realiza una validación del servidor en los siguientes casos:
Cuando proporcionas el hash MD5 o CRC32C de un objeto en una solicitud de carga de objetos. Para obtener información sobre los tipos de cargas de objetos, consulta Cargas de objetos.
Cuando realizas una solicitud de copia o reescritura dentro de Cloud Storage. Para las solicitudes de copia y reescritura de objetos, Cloud Storage automáticamente realiza la validación del servidor en función de una suma de comprobación no editable almacenada con el objeto de origen.
Cargas de una sola solicitud (multimedia) de la API de JSON
Para las cargas de contenido multimedia de la API de JSON, puedes especificar sumas de comprobación en el encabezado X-Goog-Hash de la solicitud. Por ejemplo:
curl -X POST --data-binary @Desktop/dog-pic.jpeg \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: image/jpeg" \
-H "X-Goog-Hash: crc32c=n03x6A==" \
"https://storage.googleapis.com/upload/storage/v1/b/my-bucket/o?uploadType=media&name=dog-pic.jpeg"Cargas multiparte de la API de JSON
Para las cargas multiparte de la API de JSON, puedes especificar sumas de comprobación como parte del contenedor de solicitudes, ya sea en la sección de metadatos del objeto o en una tercera cadena de límite. Para obtener detalles sobre la estructura JSON y las claves válidas de un objeto, consulta la representación del recurso Objects.
En el siguiente ejemplo, se especifica una suma de comprobación CRC32C en la parte de metadatos del objeto de un contenedor de solicitudes:
--separator_string
Content-Type: application/json; charset=UTF-8
{
"name":"my-document.txt",
"crc32c": "n03x6A=="
}
--separator_string
Content-Type: text/plain
This is a text file.
--separator_string--
En el siguiente ejemplo, se especifica una suma de comprobación CRC32C en la tercera cadena de límite de un contenedor de solicitudes:
--separator_string
Content-Type: application/json; charset=UTF-8
{
"name":"my-document.txt"
}
--separator_string
Content-Type: text/plain
This is a text file.
--separator_string
Content-Type: application/json; charset=UTF-8
{ "crc32c": "n03x6A==" }
--separator_string--
Cargas reanudables de la API de JSON
Para las cargas reanudables de la API de JSON, puedes especificar sumas de comprobación en el encabezado X-Goog-Hash de la solicitud final que completa la carga. Por ejemplo:
curl -i -X PUT --data-binary @Desktop/dog-pic.jpeg \
-H "Content-Length: 2000000" \
-H "X-Goog-Hash: crc32c=n03x6A==" \
"SESSION_URI"La suma de comprobación especificada en la solicitud final se calcula a partir de todo el objeto, no solo de los datos del objeto en la solicitud final.
Cargas de una sola solicitud de la API de XML
Para las cargas de una sola solicitud de la API de XML, puedes especificar sumas de comprobación en el
x-goog-hash encabezado de la solicitud.
Por ejemplo:
curl -X PUT --data-binary @Desktop/dog-pic.jpeg \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: image/jpeg" \
-H "x-goog-hash: crc32c=n03x6A==" \
"https://storage.googleapis.com/my-bucket/dog-pic.jpeg"Las cargas de una sola solicitud de la API de XML también aceptan el encabezado Content-MD5 HTTP estándar. Para obtener más detalles, consulta la especificación de Content-MD5.
Cargas multiparte de la API de XML
Para las cargas multiparte de la API de XML, puedes especificar una suma de comprobación para cada parte de carga individual. Para especificar una suma de comprobación individual para una parte de carga, incluye el
x-goog-hash encabezado en la solicitud de esa parte específica.
Por ejemplo:
PUT /dog-pic.jpeg?partNumber=1&uploadId=ABgVH8 HTTP/1.1 Host: my-bucket.storage.googleapis.com Content-Length: 1000000 x-goog-hash: crc32c=n03x6A==
Solo se pueden usar sumas de comprobación CRC32C para verificar la integridad de las cargas multiparte de la API de XML. No se admiten sumas de comprobación MD5.
Cargas de gRPC
Cuando subes objetos con gRPC, puedes especificar sumas de comprobación a nivel del objeto
en el primer o último WriteObject mensaje de cualquier solicitud de carga, ya sea una
carga única o una carga reanudable.
Además, gRPC admite sumas de comprobación por mensaje. Cada mensaje WriteObject contiene fragmentos de datos de hasta 2 MiB, y cada fragmento puede incluir su propia suma de comprobación. Puedes especificar sumas de comprobación por mensaje en lugar de una suma de comprobación a nivel del objeto o junto con ella.
Cargas compuestas paralelas
En el caso de las cargas compuestas paralelas, debes realizar una verificación de integridad para cada carga de componente y, luego, usar las condiciones previas con la solicitud de composición de carga para protegerte de las condiciones de carrera. Las solicitudes de composición no obtienen validación del servidor, por lo que debes realizar una validación del cliente en el objeto compuesto nuevo si deseas una verificación de integridad de extremo a extremo.
Copias y reescrituras de Google Cloud CLI
En el gcloud CLI, los datos copiados desde o hacia un
bucket de Cloud Storage se validan automáticamente. Para los comandos cp, mv y rsync, gcloud CLI usa sumas de comprobación MD5 o CRC32C para determinar si hay una diferencia entre la versión de un objeto que se encuentra en la fuente y la versión que se encuentra en el destino. Si la suma de comprobación de los datos de origen no coincide con la suma de comprobación de los datos de destino, gcloud CLI borra la copia no válida y, luego, muestra un mensaje de advertencia.
Eso no suele suceder. Si coincide, puedes intentar de nuevo la operación.
Esta validación automática se produce después de que se finaliza el objeto y los objetos no válidos son visibles durante 1 a 3 segundos antes de que se identifiquen y se borren. Además, es posible que gcloud CLI se interrumpa después de que se complete la carga, pero antes de que realice la validación, lo que deja el objeto no válido en su lugar. Estos problemas se pueden evitar cuando se suben
archivos únicos a Cloud Storage con la validación del servidor,
que ocurre cuando se usa la marca --content-md5 para especificar un hash MD5.
Google Cloud CLI ignora la marca --content-md5 para objetos que no tienen un hash MD5.
Detección de cambios para rsync
El comando gcloud storage rsync compara las sumas de comprobación en las siguientes
situaciones para determinar si se debe omitir una transferencia:
El origen y el destino son buckets de Cloud Storage, y el objeto tiene una suma de comprobación MD5 o CRC32C en ambos buckets.
El objeto no tiene una hora de modificación de archivo (
mtime) en el origen o el destino.
En los casos en los que un objeto tiene un valor mtime en el origen y el destino, como cuando el origen y el destino son sistemas de archivos, el comando rsync compara el tamaño de los objetos y el valor mtime, en lugar de usar sumas de comprobación. Del mismo modo, si la fuente es un bucket y el destino es un sistema de archivos local, el comando rsync usa la hora creada para el objeto de origen como sustituto de mtime, y el comando no usa sumas de comprobación.
Si no hay mtime ni sumas de comprobación disponibles, rsync solo compara los tamaños de archivo cuando se determina si hay un cambio entre la versión de origen de un objeto y la versión de destino. Por ejemplo, ni mtime ni las sumas de comprobación están
disponibles cuando se comparan objetos compuestos con objetos en un proveedor de servicios en la nube
que no admite CRC32C, ya que los objetos compuestos no tienen suma de comprobación MD5.
Validación del cliente para escrituras de datos
Puedes realizar una validación del cliente de tus cargas a través de la emisión de una solicitud para los metadatos del objeto subido, la comparación del valor de hash del objeto subido con el valor esperado y la eliminación del objeto en caso de no coinciden. Este método es útil si no se conoce el hash MD5 o CRC32C del objeto al inicio de la carga.
En la siguiente tabla, se incluye la versión mínima de cada cliente de Cloud Storage que admite sumas de comprobación de escritura de objetos.
| Cliente | Versión que admite sumas de comprobación de escritura de objetos |
|---|---|
| Biblioteca cliente de C++ de Cloud Storage | 2.46 y versiones posteriores |
| Biblioteca cliente de Go de Cloud Storage | 1.60.0 y versiones posteriores |
| Biblioteca cliente de Java de Cloud Storage | 2.62 y versiones posteriores |
| Biblioteca cliente de Node.js de Cloud Storage | 7.19.0 y versiones posteriores |
| Biblioteca cliente de PHP de Cloud Storage | 1.51.0 y versiones posteriores |
| Biblioteca cliente de Python de Cloud Storage | 3.7.0 y versiones posteriores |
| Biblioteca cliente de Ruby de Cloud Storage | 1.60.0 |
| Biblioteca cliente de .NET de Cloud Storage | 2.3.0 y versiones posteriores. Te recomendamos la versión 4.15.0, que proporciona validación de suma de comprobación del servidor. |
| Conector de Cloud Storage |
|
| Cloud Storage FUSE | 3.8.0 y versiones posteriores |
| Google Cloud CLI |
Sumas de comprobación para lecturas y descargas de datos
Para las lecturas y descargas de objetos, el servidor envía el objeto junto con su suma de comprobación almacenada en la respuesta. El cliente calcula su propia suma de comprobación del archivo que se leyó o descargó en función de los bytes que recibió y compara las dos sumas de comprobación para verificar la integridad de los datos.
Validación del cliente para lecturas y descargas
De forma predeterminada, todos los SDK de la biblioteca cliente de Cloud Storage admiten el cálculo de sumas de comprobación para las lecturas y descargas de objetos. En la siguiente tabla, se incluye información para inhabilitar las sumas de comprobación de lectura o descarga de objetos para cada SDK de la biblioteca cliente.
| Biblioteca cliente | Instrucciones para inhabilitar las sumas de comprobación de lectura o descarga de objetos |
|---|---|
| Biblioteca cliente de C++ de Cloud Storage | En la biblioteca cliente de C++, inhabilita la verificación de suma de comprobación configurando DownloadChecksumValidationOption en el valor ChecksumAlgorithm::kNone. |
| Biblioteca cliente de Go de Cloud Storage | En la biblioteca cliente de Go, inhabilita la verificación de suma de comprobación mediante
la provisión de opciones de lector en la inicialización. Pasa
WithDisableReaderChecksum() cuando llames a
NewReader o pasa WithDisableMRDReadChecksum()
cuando llames a NewMultiRangeDownloader. |
| Biblioteca cliente de Java de Cloud Storage | Para inhabilitar la validación interna de suma de comprobación CRC32C en las rutas de lectura de la
biblioteca cliente de Java, pasa la propiedad del sistema JVM
-Dcom.google.cloud.storage.Hasher.read=disabled, que desactiva
el generador de hash interno para las lecturas. Si deseas inhabilitar la suma de comprobación
de forma global en las lecturas y escrituras, usa
-Dcom.google.cloud.storage.Hasher.default=disabled en su lugar.
|
| Biblioteca cliente de Node.js de Cloud Storage | En la biblioteca cliente de Node.js, inhabilita la validación de suma de comprobación pasando { validation: false } dentro del objeto de opción de configuración proporcionado a las llamadas de método de descarga. |
| Biblioteca cliente de PHP de Cloud Storage | En la biblioteca cliente de PHP, inhabilita la validación de suma de comprobación en las rutas de lectura de la API de JSON y API de XML pasando 'validate' => false o 'validate' => 'none' dentro del array asociativo de opciones ($options['validate']) cuando llames a los métodos de descarga. |
| Biblioteca cliente de Python de Cloud Storage | En la biblioteca cliente de Python, la inhabilitación de la verificación de suma de comprobación depende
del transporte del cliente: para el cliente JSON, pasa
checksum=None (admite métodos como
download_to_file), mientras que para el cliente gRPC, configura
enable_checksum=False. |
| Biblioteca cliente de Ruby de Cloud Storage | En la biblioteca cliente de Ruby, inhabilita la verificación de suma de comprobación pasando argumentos de palabras clave (checksum: o verify:) directamente a los métodos de descarga, específicamente configurando verify: none o verify: false. |
| Biblioteca cliente de .NET de Cloud Storage | En la biblioteca cliente de .NET, inhabilita la verificación de suma de comprobación configurando la propiedad ChecksumValidation en DownloadValidationMode.Never en el objeto DownloadObjectOptions que se pasa a las llamadas al método de descarga. |
Realiza verificaciones de integridad de datos en objetos que se descargaron o leyeron
En algunos casos, es posible que tu aplicación deba calcular de forma independiente la suma de comprobación del archivo que se descargó o leyó con los bytes recibidos y compararla con el hash proporcionado por el servidor para verificar la integridad de los datos.
Para realizar una verificación de integridad de los datos descargados, calcula la suma de comprobación a medida que se reciben los datos y compara los resultados con la suma de comprobación proporcionada por el servidor.
Las sumas de comprobación del servidor se basan en el objeto completo, ya que se almacena en Cloud Storage, lo que significa que los siguientes tipos de descargas no se pueden validar con las sumas de comprobación proporcionadas por el servidor:
Descargas que se someten a una transcodificación descompresiva: la suma de comprobación proporcionada por el servidor representa el objeto en su estado comprimido, mientras que a los datos entregados se les quitó la compresión y, en consecuencia, se genera un valor de suma de comprobación diferente.
Una respuesta que contiene solo una parte de los datos del objeto: este tipo de respuesta se produce para las solicitudes
Range.Las lecturas de rango de gRPC son una excepción a este punto y admiten la validación de extremo a extremo. En las lecturas de rango de gRPC, Cloud Storage valida los datos incluyendo una suma de comprobación CRC32C única dentro de cada fragmento de respuesta individual de una transmisión, lo que permite que el cliente verifique de inmediato que el bloque de datos específico no se dañó en tránsito. Para una validación más amplia, la transmisión también proporciona la suma de comprobación completa de todo el objeto, que los clientes avanzados pueden usar para calcular un total acumulado y verificar la integridad del archivo más grande.
Si tu aplicación necesita leer rangos de objetos en lugar de objetos completos a la vez, te recomendamos que uses gRPC. De lo contrario, te recomendamos que uses solicitudes de rango solo para reiniciar la descarga de un objeto completo después de la última compensación recibida, en la que puedes calcular y validar la suma de comprobación después de que se complete la descarga.
Cuando validas tu descarga, una falta de coincidencia entre la suma de comprobación calculada y la suma de comprobación proporcionada por el servidor indica que los datos se dañaron en tránsito. En estos casos, debes descartar los datos dañados y usar la lógica de reintento recomendada para reintentar la solicitud.
¿Qué sigue?
- Obtén información sobre las cargas de objetos y las descargas de objetos en Cloud Storage.
- Obtén información sobre las estrategias de reintento para Cloud Storage.