Conceptos de encriptación AEAD en SQL estándar

Este tema explica los conceptos en los que se basa la encriptación AEAD en BigQuery. Para obtener una descripción de las diferentes funciones de encriptación AEAD compatibles con BigQuery, consulta Funciones de encriptación AEAD.

Propósito de la encriptación AEAD

BigQuery mantiene sus datos seguros mediante la encriptación en reposo. BigQuery también brinda asistencia para las claves de encriptación administradas por el cliente (CMEK), lo que te permite encriptar tablas con claves de encriptación específicas. Sin embargo, en algunos casos, es posible que desees encriptar valores individuales dentro de una tabla.

Por ejemplo, deseas mantener los datos de todos tus clientes propios en una tabla común y encriptar los datos de cada uno de tus clientes con una clave diferente. Tienes datos distribuidos en varias tablas que deseas poder "borrar de forma criptográfica". La eliminación criptográfica, o crypto-shedding, es el proceso de eliminar una clave de encriptación para hacer que cualquier dato encriptado con una clave sea ilegible.

Las funciones de cifrado AEAD te permiten crear conjuntos de claves que contienen claves para la encriptación y desencriptación, usar estas claves a fin de encriptar y desencriptar valores individuales en una tabla y rotar claves dentro de un conjunto de claves.

Conjuntos de claves

Un conjunto de claves es una colección de claves criptográficas, una de las cuales es la principal y el resto, si las hay, son claves criptográficas secundarias. Cada clave codifica un algoritmo de encriptación o desencriptación; si la clave está habilitada, inhabilitada o destruida; y, para las claves no destruidas, los bytes de clave en sí mismos. La clave criptográfica principal determina cómo se encripta el texto sin formato de entrada. La clave criptográfica principal nunca puede estar en estado inhabilitado. Las claves criptográficas secundarias solo se utilizan para desencriptación y pueden estar habilitadas o inhabilitadas. Se puede utilizar un conjunto de claves a fin de desencriptar cualquier dato que se utilizó para encriptar.

La representación de un conjunto de claves en BigQuery es un búfer de protocolo serializado google.crypto.tink.Keyset en BYTES.

Ejemplo

El siguiente es un ejemplo de un conjunto de claves AEAD, representado como una string JSON, con tres claves.

primary_key_id: 569259624
key {
  key_data {
    type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
    value: ",&\264kh\377\306\217\371\233E<\0350A4\023B-pd\203\277\240\371\212^\210bf\347\256"
    key_material_type: SYMMETRIC
  }
  status: ENABLED
  key_id: 569259624
  output_prefix_type: TINK
}
key {
  key_data {
    type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
    value: "\374\336+.\333\245k\364\010`\037\267!\376\233\\3\215\020\356B\236\240O\256U\021\266\217\277\217\271"
    key_material_type: SYMMETRIC
  }
  status: DISABLED
  key_id: 852264701
  output_prefix_type: TINK
}
key {
  status: DESTROYED
  key_id: 237910588
  output_prefix_type: TINK
}

En el ejemplo anterior, la clave criptográfica principal tiene un ID de 569259624 y es la primera clave que aparece en la string JSON. Hay dos claves criptográficas secundarias, una con ID 852264701 en estado inhabilitado y otra con ID 237910588 en estado destruido. Cuando una función de encriptación AEAD usa este conjunto de claves para la encriptación, el cifrado resultante cifra el ID de la clave criptográfica principal de 569259624 .

Cuando una función AEAD utiliza este conjunto de claves para la desencriptación, la función elige la clave apropiada para desencriptar basándose en el ID de clave encriptada en el cifrado; en el ejemplo anterior, intentar desencriptar con los ID de las clave 852264701 o 237910588 daría como resultado un error, porque el ID de la clave 852264701 está inhabilitado y el ID 237910588 destruido. Restablecer el ID de la clave 852264701 a un estado habilitado lo volvería utilizable para la desencriptación.

El tipo de clave determina el modo de encriptación que se usará con esa clave.

Encriptar texto sin formato más de una vez con el mismo conjunto de claves generalmente mostrará diferentes valores de cifrado debido a diferentes vectores de inicialización (IV), que se eligen mediante el generador de números seudoaleatorio proporcionado por OpenSSL.

Estándar de encriptación avanzado (AES)

Las funciones de cifrado AEAD usan la encriptación AES (Estándar de encriptación avanzada). La encriptación AES toma el texto sin formato como entrada, junto con una clave criptográfica, y muestra una secuencia encriptada de bytes como resultado. Esta secuencia de bytes se puede desencriptar posteriormente mediante la misma clave que se utilizó para encriptarla. AES utiliza un tamaño de bloque de 16 bytes, lo que significa que el texto sin formato se trata como una secuencia de bloques de 16 bytes. El cifrado contendrá un prefijo específico de Tink que indica la clave utilizada para realizar la encriptación. La encriptación AES admite varios modos de cifrado de bloque.

Modos de cifrado en bloque

Los dos modos de cifrado en bloque admitidos por las funciones de encriptación AEAD son GCM y CBC.

GCM

El modo Galois / Counter (GCM) es un modo para la encriptación AES. La función numera los bloques secuencialmente y combina este número de bloque con un vector de inicialización (IV). Un vector de inicialización es un valor aleatorio o seudoaleatorio que forma la base de la aleatorización de los datos de texto sin formato. A continuación, la función encripta el número de bloque combinado y el IV mediante AES. Luego, la función realiza una operación exclusiva lógica a nivel de los bits o (XOR) en el resultado de la encriptación y el texto sin formato para producir el cifrado. El modo GCM utiliza una clave criptográfica de 128 o 256 bits de longitud.

Modo CBC

CBC "encadena" los bloques mediante el XOR de cada bloque de texto sin formato con el bloque anterior de cifrado antes de encriptarlo. El modo CBC utiliza una clave criptográfica de 128, 192 o 256 bits de longitud. CBC utiliza un vector de inicialización de 16 bytes como bloque inicial y realiza un XOR en este bloque con el primer bloque de texto sin formato.

Datos adicionales

Las funciones de encriptación AEAD admiten el uso de un argumento additional_data, también conocido como datos asociados (AD) o datos autenticados adicionales. A diferencia del conjunto de claves, estos datos adicionales no permiten la desencriptación del cifrado que resulta por sí mismo. Estos datos adicionales garantizan la autenticidad y la integridad de los datos encriptados, pero no su secreto.

Por ejemplo, additional_data puede ser el resultado de CAST(customer_id AS STRING) cuando se encriptan datos de un cliente en particular. Esto garantiza que cuando se desencripten los datos, se hayan encriptado previamente mediante el customer_id esperado. El mismo valor additional_data se requiere para la desencriptación. Para obtener más información, consulta RFC 5116.

Desencriptación

El resultado de AEAD.ENCRYPT son BYTES cifrados. Las funciones AEAD.DECRYPT_STRING o AEAD.DECRYPT_BYTES pueden desencriptar este cifrado. Estas funciones deben usar un conjunto de claves que contenga la clave que se utilizó para la encriptación. Esa clave debe estar en un estado 'ENABLED'. También deben usar los mismos additional_data que se usaron en la encriptación.

Cuando el conjunto de claves se utiliza para la desencriptación, se elige la clave apropiada para esto en función del ID de la clave encriptada en el cifrado.

El resultado de AEAD.DECRYPT_STRING es una STRING de texto sin formato, mientras que el resultado de AEAD.DECRYPT_BYTES es BYTES de texto sin formato. AEAD.DECRYPT_STRING puede desencriptar cifrado que codifica un valor de la STRING; AEAD.DECRYPT_BYTES puede desencriptar cifrado que codifica un valor de BYTES. Usar una de estas funciones a fin de desencriptar un cifrado que codifica el tipo de datos incorrecto, como utilizar AEAD.DECRYPT_STRING para desencriptar cifrado que codifica un valor BYTES, causa un comportamiento indefinido y puede provocar un error.

Rotación de claves

El propósito principal de rotar las claves de encriptación es reducir la cantidad de datos encriptados con cualquier clave en particular, de modo que una clave potencialmente comprometida le permitiría acceder a menos datos a un atacante.

La rotación del conjunto de claves implica lo siguiente:

  1. Crear una nueva clave criptográfica primaria dentro de cada conjunto de claves
  2. Desencriptar y volver a encriptar todos los datos encriptados

La función KEYS.ROTATE_KEYSET realiza el primer paso, ya que agrega una nueva clave criptográfica al conjunto de claves y cambia la clave criptográfica principal antigua por una secundaria.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.