GoogleSQL para BigQuery es compatible con las siguientes funciones de encriptación AEAD. Para obtener una descripción de cómo se usan las funciones de encriptación AEAD, consulta Conceptos de encriptación AEAD.
AEAD.DECRYPT_BYTES
AEAD.DECRYPT_BYTES(keyset, ciphertext, additional_data)
Descripción
Usa la clave de coincidencia de keyset
para desencriptar ciphertext
y verifica la integridad de los datos mediante additional_data
. Muestra un error si la desencriptación o la verificación fallan.
keyset
es un valor en BYTES
serializado mostrado por una de las funciones KEYS
o una STRUCT
que muestra KEYS.KEYSET_CHAIN
. keyset
debe contener la clave que se usó para encriptar el ciphertext
, y la clave debe estar en un estado 'ENABLED'
, de lo contrario, la función mostrará un error AEAD.DECRYPT_BYTES
identifica la clave que coincide en el keyset
. Para ello, busca la clave con el ID de clave correspondiente al que está encriptado en el ciphertext
.
ciphertext
es un valor en BYTES
que es el resultado de una llamada a AEAD.ENCRYPT
donde la entrada plaintext
era del tipo BYTES
.
Si ciphertext
incluye un vector de inicialización (IV), debe ser los primeros bytes de ciphertext
. Si ciphertext
incluye una etiqueta de autenticación, deben ser los últimos bytes de ciphertext
. Si la etiqueta IV y la autenticidad son una (SIV), deben ser los primeros bytes de ciphertext
. Por lo general, la etiqueta IV y la etiqueta de autenticación requieren 16 bytes, pero su tamaño puede variar.
additional_data
es un valor STRING
o BYTES
que vincula el texto cifrado a su contexto. Esto obliga a que el cifrado se desencripte en el mismo contexto en el que se encriptó. Esta función arroja cualquier valor STRING
a BYTES
.
Debe ser el mismo que el additional_data
proporcionado a AEAD.ENCRYPT
para encriptar ciphertext
, sin importar su tipo, de lo contrario, la función mostrará un error.
Tipo de datos mostrados
BYTES
Ejemplo
En este ejemplo, se crea una tabla de ID únicos con valores de texto sin formato y conjuntos de claves asociados. Luego, usa estos conjuntos de claves para encriptar los valores de texto sin formato como BYTES
y almacenarlos en una tabla nueva. Por último, usa AEAD.DECRYPT_BYTES
para desencriptar los valores encriptados y mostrarlos como texto sin formato.
La siguiente declaración crea una tabla CustomerKeysets
que contiene una columna de ID únicos, una columna de conjuntos de claves AEAD_AES_GCM_256
y una columna de animales favoritos.
CREATE TABLE aead.CustomerKeysets AS
SELECT
1 AS customer_id,
KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS keyset,
b'jaguar' AS favorite_animal
UNION ALL
SELECT
2 AS customer_id,
KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS keyset,
b'zebra' AS favorite_animal
UNION ALL
SELECT
3 AS customer_id,
KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS keyset,
b'nautilus' AS favorite_animal;
La siguiente instrucción crea una tabla EncryptedCustomerData
que contiene una columna de ID únicos y una columna de cifrado. La instrucción encripta el texto sin formato favorite_animal
con el valor del conjunto de claves de CustomerKeysets
correspondiente a cada ID único.
CREATE TABLE aead.EncryptedCustomerData AS
SELECT
customer_id,
AEAD.ENCRYPT(keyset, favorite_animal, CAST(CAST(customer_id AS STRING) AS BYTES))
AS encrypted_animal
FROM
aead.CustomerKeysets AS ck;
La siguiente consulta usa los conjuntos de claves en la tabla CustomerKeysets
para desencriptar datos en la tabla EncryptedCustomerData
.
SELECT
ecd.customer_id,
AEAD.DECRYPT_BYTES(
(SELECT ck.keyset
FROM aead.CustomerKeysets AS ck
WHERE ecd.customer_id = ck.customer_id),
ecd.encrypted_animal,
CAST(CAST(customer_id AS STRING) AS BYTES)
) AS favorite_animal
FROM aead.EncryptedCustomerData AS ecd;
AEAD.DECRYPT_STRING
AEAD.DECRYPT_STRING(keyset, ciphertext, additional_data)
Descripción
Es similar a AEAD.DECRYPT_BYTES
, pero en este, plaintext
es de tipo STRING
.
Tipo de datos mostrados
STRING
AEAD.ENCRYPT
AEAD.ENCRYPT(keyset, plaintext, additional_data)
Descripción
Encripta plaintext
mediante la clave criptográfica principal de keyset
. El algoritmo de la clave primaria debe ser AEAD_AES_GCM_256
. Vincula el texto cifrado al contexto definido por additional_data
. Muestra NULL
si alguna entrada es NULL
.
keyset
es un valor en BYTES
serializado mostrado por una de las funciones KEYS
o una STRUCT
que muestra KEYS.KEYSET_CHAIN
.
plaintext
es el valor de STRING
o en BYTES
que se encriptará.
additional_data
es un valor STRING
o BYTES
que vincula el texto cifrado a su contexto. Esto obliga a que el cifrado se desencripte en el mismo contexto en el que se encriptó. plaintext
y additional_data
deben ser del mismo tipo. AEAD.ENCRYPT(keyset, string1, string2)
es equivalente a AEAD.ENCRYPT(keyset, CAST(string1 AS BYTES), CAST(string2 AS BYTES))
.
El resultado es el texto cifrado BYTES
. El texto cifrado contiene un prefijo específico de Tink que indica la clave usada para realizar la encriptación.
Tipo de datos mostrados
BYTES
Ejemplo
En la siguiente consulta, se usan los conjuntos de claves de cada customer_id
en la tabla CustomerKeysets
para encriptar el valor del texto sin formato favorite_animal
en la tabla PlaintextCustomerData
correspondiente a ese customer_id
. El resultado contiene una columna de valores customer_id
y una columna del resultado de texto cifrado correspondiente en BYTES
.
WITH CustomerKeysets AS (
SELECT 1 AS customer_id, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS keyset UNION ALL
SELECT 2, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') UNION ALL
SELECT 3, KEYS.NEW_KEYSET('AEAD_AES_GCM_256')
), PlaintextCustomerData AS (
SELECT 1 AS customer_id, 'elephant' AS favorite_animal UNION ALL
SELECT 2, 'walrus' UNION ALL
SELECT 3, 'leopard'
)
SELECT
pcd.customer_id,
AEAD.ENCRYPT(
(SELECT keyset
FROM CustomerKeysets AS ck
WHERE ck.customer_id = pcd.customer_id),
pcd.favorite_animal,
CAST(pcd.customer_id AS STRING)
) AS encrypted_animal
FROM PlaintextCustomerData AS pcd;
DETERMINISTIC_DECRYPT_BYTES
DETERMINISTIC_DECRYPT_BYTES(keyset, ciphertext, additional_data)
Descripción
Usa la clave de coincidencia de keyset
para desencriptar ciphertext
y verifica la integridad de los datos mediante additional_data
. Muestra un error si la desencriptación falla.
keyset
es un valor BYTES
serializado o un valor STRUCT
que muestra una de las funciones KEYS
. keyset
debe contener la clave que se usó para encriptar ciphertext
, la clave debe estar en un estado 'ENABLED'
y la clave deben ser de tipo DETERMINISTIC_AEAD_AES_SIV_CMAC_256
, de lo contrario, la función mostrará un error. DETERMINISTIC_DECRYPT_BYTES
identifica la clave que coincide en el keyset
. Para ello, busca la clave con el ID de clave correspondiente al que está encriptado en el ciphertext
.
ciphertext
es un valor en BYTES
que es el resultado de una llamada a DETERMINISTIC_ENCRYPT
donde la entrada plaintext
era del tipo BYTES
.
El texto cifrado debe seguir el formato de cable de Tink. El primer byte de ciphertext
debe contener una versión de clave de Tink seguida de una sugerencia de clave de 4 bytes. Si ciphertext
incluye un vector de inicialización (IV), debe ser los siguientes bytes de ciphertext
. Si ciphertext
incluye una etiqueta de autenticación, deben ser los últimos bytes de ciphertext
. Si las etiquetas IV y de autenticación son una (SIV), deben ser los primeros bytes de ciphertext
. Por lo general, las etiquetas IV y de autenticación requieren 16 bytes, pero su tamaño puede variar.
additional_data
es un valor STRING
o BYTES
que vincula el texto cifrado a su contexto. Esto obliga a que el cifrado se desencripte en el mismo contexto en el que se encriptó. Esta función arroja cualquier valor de STRING
a BYTES
. Debe ser igual que additional_data
proporcionados a DETERMINISTIC_ENCRYPT
para encriptar ciphertext
, sin importar su tipo, o la función mostrará un error.
Tipo de datos mostrados
BYTES
Ejemplo
En este ejemplo, se crea una tabla de ID únicos con valores de texto sin formato y conjuntos de claves asociados. Luego, usa estos conjuntos de claves para encriptar los valores de texto sin formato como BYTES
y almacenarlos en una tabla nueva. Por último, usa DETERMINISTIC_DECRYPT_BYTES
para desencriptar los valores encriptados y mostrarlos como texto sin formato.
La siguiente declaración crea una tabla CustomerKeysets
que contiene una columna de ID únicos, una columna de conjuntos de claves DETERMINISTIC_AEAD_AES_SIV_CMAC_256
y una columna de animales favoritos.
CREATE TABLE deterministic.CustomerKeysets AS
SELECT
1 AS customer_id,
KEYS.NEW_KEYSET('DETERMINISTIC_AEAD_AES_SIV_CMAC_256') AS keyset,
b'jaguar' AS favorite_animal
UNION ALL
SELECT
2 AS customer_id,
KEYS.NEW_KEYSET('DETERMINISTIC_AEAD_AES_SIV_CMAC_256') AS keyset,
b'zebra' AS favorite_animal
UNION ALL
SELECT
3 AS customer_id,
KEYS.NEW_KEYSET('DETERMINISTIC_AEAD_AES_SIV_CMAC_256') AS keyset,
b'nautilus' AS favorite_animal;
La siguiente instrucción crea una tabla EncryptedCustomerData
que contiene una columna de ID únicos y una columna de cifrado. La instrucción encripta el texto sin formato favorite_animal
con el valor del conjunto de claves de CustomerKeysets
correspondiente a cada ID único.
CREATE TABLE deterministic.EncryptedCustomerData AS
SELECT
customer_id,
DETERMINISTIC_ENCRYPT(ck.keyset, favorite_animal, CAST(CAST(customer_id AS STRING) AS BYTES))
AS encrypted_animal
FROM
deterministic.CustomerKeysets AS ck;
La siguiente consulta usa los conjuntos de claves en la tabla CustomerKeysets
para desencriptar datos en la tabla EncryptedCustomerData
.
SELECT
ecd.customer_id,
DETERMINISTIC_DECRYPT_BYTES(
(SELECT ck.keyset
FROM deterministic.CustomerKeysets AS ck
WHERE ecd.customer_id = ck.customer_id),
ecd.encrypted_animal,
CAST(CAST(ecd.customer_id AS STRING) AS BYTES)
) AS favorite_animal
FROM deterministic.EncryptedCustomerData AS ecd;
DETERMINISTIC_DECRYPT_STRING
DETERMINISTIC_DECRYPT_STRING(keyset, ciphertext, additional_data)
Descripción
Es similar a DETERMINISTIC_DECRYPT_BYTES
, pero plaintext
es de tipo STRING
.
Tipo de datos mostrados
STRING
DETERMINISTIC_ENCRYPT
DETERMINISTIC_ENCRYPT(keyset, plaintext, additional_data)
Descripción
Encripta plaintext
mediante la clave criptográfica principal en keyset
mediante AEAD determinista. El algoritmo de la clave primaria debe ser DETERMINISTIC_AEAD_AES_SIV_CMAC_256
. Vincula el texto cifrado al contexto definido por additional_data
. Muestra NULL
si alguna entrada es NULL
.
keyset
es un valor BYTES
serializado o un valor STRUCT
que muestra una de las funciones KEYS
.
plaintext
es el valor de STRING
o en BYTES
que se encriptará.
additional_data
es un valor STRING
o BYTES
que vincula el texto cifrado a su contexto. Esto obliga a que el cifrado se desencripte en el mismo contexto en el que se encriptó. plaintext
y additional_data
deben ser del mismo tipo. DETERMINISTIC_ENCRYPT(keyset, string1, string2)
es equivalente a DETERMINISTIC_ENCRYPT(keyset, CAST(string1 AS BYTES), CAST(string2 AS BYTES))
.
El resultado es el texto cifrado BYTES
. El texto cifrado contiene un prefijo específico de Tink que indica la clave usada para realizar la encriptación.
Con un keyset
y un plaintext
idénticos, esta función muestra el mismo texto cifrado cada vez que se invoca (incluidas las consultas).
Tipo de datos mostrados
BYTES
Ejemplo
En la siguiente consulta, se usan los conjuntos de claves de cada customer_id
en la tabla CustomerKeysets
para encriptar el valor del texto sin formato favorite_animal
en la tabla PlaintextCustomerData
correspondiente a ese customer_id
. El resultado contiene una columna de valores customer_id
y una columna del resultado de texto cifrado correspondiente en BYTES
.
WITH CustomerKeysets AS (
SELECT 1 AS customer_id,
KEYS.NEW_KEYSET('DETERMINISTIC_AEAD_AES_SIV_CMAC_256') AS keyset UNION ALL
SELECT 2, KEYS.NEW_KEYSET('DETERMINISTIC_AEAD_AES_SIV_CMAC_256') UNION ALL
SELECT 3, KEYS.NEW_KEYSET('DETERMINISTIC_AEAD_AES_SIV_CMAC_256')
), PlaintextCustomerData AS (
SELECT 1 AS customer_id, 'elephant' AS favorite_animal UNION ALL
SELECT 2, 'walrus' UNION ALL
SELECT 3, 'leopard'
)
SELECT
pcd.customer_id,
DETERMINISTIC_ENCRYPT(
(SELECT keyset
FROM CustomerKeysets AS ck
WHERE ck.customer_id = pcd.customer_id),
pcd.favorite_animal,
CAST(pcd.customer_id AS STRING)
) AS encrypted_animal
FROM PlaintextCustomerData AS pcd;
KEYS.ADD_KEY_FROM_RAW_BYTES
KEYS.ADD_KEY_FROM_RAW_BYTES(keyset, key_type, raw_key_bytes)
Descripción
Muestra un conjunto de claves serializado como BYTES
con la adición de una clave a keyset
basada en key_type
y raw_key_bytes
.
La clave criptográfica principal sigue siendo la misma que en keyset
. La longitud esperada de raw_key_bytes
depende del valor de key_type
. Los siguientes son key_types
compatibles:
'AES_CBC_PKCS'
: crea una clave para la desencriptación AES mediante el encadenamiento de bloques de cifrado y el relleno de PKCS. Se espera queraw_key_bytes
sea un valor enBYTES
de clave sin procesar de 16, 24 o 32 de longitud; estas longitudes tienen tamaños de 128, 192 y 256 bits, respectivamente. Las funciones AEAD de BigQuery no admiten claves de estos tipos para la encriptación; en su lugar, se prefieren las teclas'AEAD_AES_GCM_256'
o'AES_GCM'
.'AES_GCM'
: Crea una clave para la encriptación o desencriptación de AES con Galois/Counter Mode.raw_key_bytes
debe ser un valorBYTES
de clave sin procesar de 16 o 32 longitud; estas longitudes tienen tamaños de 128 y 256 bits, respectivamente. Cuando se usan claves de este tipo como entrada paraAEAD.ENCRYPT
, el cifrado resultante no tiene un prefijo específico de Tink que indique cuál fue la clave usada.
Tipo de datos mostrados
BYTES
Ejemplo
La siguiente consulta crea una tabla de ID de cliente junto con bytes de clave sin procesar, denominada CustomerRawKeys
, y una tabla de ID únicos, llamada CustomerIds
. Crea un conjunto de claves 'AEAD_AES_GCM_256'
nuevo para cada customer_id
; luego agrega una clave nueva a cada conjunto de claves, mediante el uso del valor raw_key_bytes
correspondiente a ese customer_id
. El resultado es una tabla en la que cada fila contiene un customer_id
y un conjunto de claves en BYTES
, que contiene la clave sin procesar que se agregó mediante KEYS.ADD_KEY_FROM_RAW_BYTES.
WITH CustomerRawKeys AS (
SELECT 1 AS customer_id, b'0123456789012345' AS raw_key_bytes UNION ALL
SELECT 2, b'9876543210543210' UNION ALL
SELECT 3, b'0123012301230123'
), CustomerIds AS (
SELECT 1 AS customer_id UNION ALL
SELECT 2 UNION ALL
SELECT 3
)
SELECT
ci.customer_id,
KEYS.ADD_KEY_FROM_RAW_BYTES(
KEYS.NEW_KEYSET('AEAD_AES_GCM_256'),
'AES_CBC_PKCS',
(SELECT raw_key_bytes FROM CustomerRawKeys AS crk
WHERE crk.customer_id = ci.customer_id)
) AS keyset
FROM CustomerIds AS ci;
Los conjuntos de claves de salida contienen dos elementos cada uno: la clave criptográfica principal creada con KEYS.NEW_KEYSET('AEAD_AES_GCM_256')
y la clave sin procesar que se agregó mediante KEYS.ADD_KEY_FROM_RAW_BYTES
. Si se usa un conjunto de claves resultantes con AEAD.ENCRYPT
, GoogleSQL usa la clave criptográfica principal creada con KEYS.NEW_KEYSET('AEAD_AES_GCM_256')
para encriptar el texto sin formato de entrada. Si el conjunto de claves se usa con AEAD.DECRYPT_STRING
o AEAD.DECRYPT_BYTES
, GoogleSQL muestra el texto sin formato resultante si alguna de las dos claves tiene éxito al desencriptar el texto cifrado.
KEYS.KEYSET_CHAIN
KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset)
Descripción
Se puede usar en lugar del argumento keyset
a las funciones de encriptación determinista y AEAD a fin de pasar un conjunto de claves de Tink encriptado con una clave de Cloud KMS. Esta función te permite usar otras funciones de AEAD sin incluir claves de texto simple en una consulta.
Esta función toma los siguientes argumentos:
kms_resource_name
: Es un literal deSTRING
que contiene la ruta de acceso al recurso a la clave de Cloud KMS que se usa para desencriptarfirst_level_keyset
. Esta clave debe residir en la misma región de Cloud en la que se ejecuta esta función. Una clave de Cloud KMS se ve así:gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key
first_level_keyset
: Un literal deBYTES
que representa un conjunto de claves o un conjunto de claves unidos.
Tipo de datos mostrados
STRUCT
Ejemplo
En este ejemplo, se crea una tabla de datos de ejemplo y, luego, se muestra cómo encriptar esos datos mediante un conjunto de claves unidas (encriptadas). Por último, se muestra cómo consultar la versión encriptada de los datos.
La siguiente instrucción crea una tabla RawCustomerData
que contiene una columna de ID de cliente y una columna de animales favoritos.
CREATE TABLE aead.RawCustomerData AS
SELECT
1 AS customer_id,
b'jaguar' AS favorite_animal
UNION ALL
SELECT
2 AS customer_id,
b'zebra' AS favorite_animal
UNION ALL
SELECT
3 AS customer_id,
b'zebra' AS favorite_animal;
La siguiente instrucción crea una tabla EncryptedCustomerData
que contiene una columna de ID únicos y una columna de cifrado. La instrucción encripta el texto simple favorite_animal
con el primer valor_levelset proporcionado.
DECLARE kms_resource_name STRING;
DECLARE first_level_keyset BYTES;
SET kms_resource_name = 'gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key';
SET first_level_keyset = b'\012\044\000\107\275\360\176\264\206\332\235\215\304...';
CREATE TABLE aead.EncryptedCustomerData AS
SELECT
customer_id,
AEAD.ENCRYPT(
KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset),
favorite_animal,
CAST(CAST(customer_id AS STRING) AS BYTES)
) AS encrypted_animal
FROM
aead.RawCustomerData;
La siguiente consulta usa el primer_level_keyset para desencriptar los datos en la tabla EncryptedCustomerData
.
DECLARE kms_resource_name STRING;
DECLARE first_level_keyset BYTES;
SET kms_resource_name = 'gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key';
SET first_level_keyset = b'\012\044\000\107\275\360\176\264\206\332\235\215\304...';
SELECT
customer_id,
AEAD.DECRYPT_BYTES(
KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset),
encrypted_animal,
CAST(CAST(customer_id AS STRING) AS BYTES)
) AS favorite_animal
FROM
aead.EncryptedCustomerData;
Los dos pasos anteriores también resultan con las funciones DETERMINISTIC_ENCRYPT
y DETERMINISTIC_DECRYPT_BYTES
. El conjunto de claves unido debe crearse con el tipo DETERMINISTIC_AEAD_AES_SIV_CMAC_256
.
La siguiente instrucción crea una tabla EncryptedCustomerData
que contiene una columna de ID únicos y una columna de cifrado. La instrucción encripta el texto simple favorite_animal
con el primer valor_levelset proporcionado. Puedes ver que el texto cifrado de favorite_animal
es el mismo para los clientes 2 y 3, ya que el texto sin formato favorite_animal
es el mismo.
DECLARE kms_resource_name STRING;
DECLARE first_level_keyset BYTES;
SET kms_resource_name = 'gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key';
SET first_level_keyset = b'\012\044\000\107\275\360\176\264\206\332\235\215\304...';
CREATE TABLE daead.EncryptedCustomerData AS
SELECT
customer_id,
DETERMINISTC_ENCRYPT(
KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset),
favorite_animal,
CAST(CAST(customer_id AS STRING) AS BYTES)
) AS encrypted_animal
FROM
daead.RawCustomerData;
La siguiente consulta usa el primer_level_keyset para desencriptar los datos en la tabla EncryptedCustomerData
.
DECLARE kms_resource_name STRING;
DECLARE first_level_keyset BYTES;
SET kms_resource_name = 'gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key';
SET first_level_keyset = b'\012\044\000\107\275\360\176\264\206\332\235\215\304...';
SELECT
customer_id,
DETERMINISTIC_DECRYPT_BYTES(
KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset),
encrypted_animal,
CAST(CAST(customer_id AS STRING) AS BYTES)
) AS favorite_animal
FROM dead.EncryptedCustomerData;
KEYS.KEYSET_FROM_JSON
KEYS.KEYSET_FROM_JSON(json_keyset)
Descripción
Muestra la entrada json_keyset
STRING
en forma de BYTES
serializados, que es una entrada válida para otras funciones KEYS
y AEAD
. El STRING
JSON debe ser compatible con la definición del mensaje de búfer de protocolo google.crypto.tink.Keyset: el conjunto de claves JSON debe ser un objeto JSON que contenga objetos y pares de nombre-valor correspondientes a esos en el mensaje “conjunto de claves” en la definición en google.crypto.tink.Keyset. La representación resultante en BYTES
serializados puede volver a convertirse en una STRING
JSON mediante KEYS.KEYSET_TO_JSON
.
Tipo de datos mostrados
BYTES
Ejemplo
KEYS.KEYSET_FROM_JSON
toma valores de STRING
con formato JSON como los siguientes:
{
"key":[
{
"keyData":{
"keyMaterialType":"SYMMETRIC",
"typeUrl":"type.googleapis.com/google.crypto.tink.AesGcmKey",
"value":"GiD80Z8kL6AP3iSNHhqseZGAIvq7TVQzClT7FQy8YwK3OQ=="
},
"keyId":3101427138,
"outputPrefixType":"TINK",
"status":"ENABLED"
}
],
"primaryKeyId":3101427138
}
La siguiente consulta crea un nuevo conjunto de claves a partir de un STRING
json_keyset
con formato JSON:
SELECT KEYS.KEYSET_FROM_JSON(json_keyset);
Esto muestra el json_keyset
serializado en BYTES
, como el siguiente:
\x08\x9d\x8e\x85\x82\x09\x12d\x0aX\x0a0
type.googleapis.com/google.crypto.tink.AesGcmKey\x12\"\x1a qX\xe4IG\x87\x1f\xde
\xe3)+e\x98\x0a\x1c}\xfe\x88<\x12\xeb\xc1t\xb8\x83\x1a\xcd\xa8\x97\x84g\x18\x01
\x10\x01\x18\x9d\x8e\x85\x82\x09 \x01
KEYS.KEYSET_LENGTH
KEYS.KEYSET_LENGTH(keyset)
Descripción
Muestra la cantidad de claves en el conjunto de claves proporcionado.
Tipo de datos mostrados
INT64
Ejemplo
En este ejemplo se hace referencia a una STRING con formato JSON llamada json_keyset
que contiene dos claves:
{
"primaryKeyId":1354994251,
"key":[
{
"keyData":{
"keyMaterialType":"SYMMETRIC",
"typeUrl":"type.googleapis.com/google.crypto.tink.AesGcmKey",
"value":"GiD9sxQRgFj4aYN78vaIlxInjZkG/uvyWSY9a8GN+ELV2Q=="
},
"keyId":1354994251,
"outputPrefixType":"TINK",
"status":"ENABLED"
}
],
"key":[
{
"keyData":{
"keyMaterialType":"SYMMETRIC",
"typeUrl":"type.googleapis.com/google.crypto.tink.AesGcmKey",
"value":"PRn76sxQRgFj4aYN00vaIlxInjZkG/uvyWSY9a2bLRm"
},
"keyId":852264701,
"outputPrefixType":"TINK",
"status":"DISABLED"
}
]
}
La siguiente consulta convierte json_keyset
en un conjunto de claves y, luego, muestra la cantidad de claves en el conjunto:
SELECT KEYS.KEYSET_LENGTH(KEYS.KEYSET_FROM_JSON(json_keyset)) as key_count;
/*-----------*
| key_count |
+-----------+
| 2 |
*-----------*/
KEYS.KEYSET_TO_JSON
KEYS.KEYSET_TO_JSON(keyset)
Descripción
Muestra una representación de STRING
de JSON del keyset
de entrada. La STRING
de JSON que se muestra es compatible con la definición del mensaje de búfer de protocolo google.crypto.tink.Keyset Puedes convertir la representación de JSON STRING
de nuevo en BYTES
con KEYS.KEYSET_FROM_JSON
.
Tipo de datos mostrados
STRING
Ejemplo
La siguiente consulta muestra un nuevo conjunto de claves 'AEAD_AES_GCM_256'
como una STRING
con formato JSON.
SELECT KEYS.KEYSET_TO_JSON(KEYS.NEW_KEYSET('AEAD_AES_GCM_256'));
El resultado es una STRING
como la siguiente.
{
"key":[
{
"keyData":{
"keyMaterialType":"SYMMETRIC",
"typeUrl":"type.googleapis.com/google.crypto.tink.AesGcmKey",
"value":"GiD80Z8kL6AP3iSNHhqseZGAIvq7TVQzClT7FQy8YwK3OQ=="
},
"keyId":3101427138,
"outputPrefixType":"TINK",
"status":"ENABLED"
}
],
"primaryKeyId":3101427138
}
KEYS.NEW_KEYSET
KEYS.NEW_KEYSET(key_type)
Descripción
Muestra un conjunto de claves serializado que contiene una clave nueva basada en key_type
. El conjunto de claves que se muestra es una representación serializada en BYTES
de google.crypto.tink.Keyset que contiene una clave criptográfica principal, sin claves adicionales. Puedes usar el conjunto de claves con las funciones AEAD.ENCRYPT
, AEAD.DECRYPT_BYTES
y AEAD.DECRYPT_STRING
para la encriptación y desencriptación, así como con el grupo KEYS
de funciones relacionadas con las claves y el conjunto de claves.
key_type
es una representación literal en STRING
del tipo de clave que se creará.
key_type
no puede ser NULL
. key_type
puede ser alguno de los siguientes:
AEAD_AES_GCM_256
crea una clave de 256 bits con el generador de números seudoaleatorio proporcionado por boringSSL. La clave usa AES-GCM para las operaciones de encriptación y desencriptación.DETERMINISTIC_AEAD_AES_SIV_CMAC_256
: Crea una claveAES-SIV-CMAC
de 512 bits, que contiene una claveAES-CTR
de 256 bits y una claveAES-CMAC
de 256 bits. La claveAES-SIV-CMAC
se crea con el generador de números seudoaleatorios proporcionado por boringSSL. La clave usa AES-SIV para las operaciones de encriptación y desencriptación.
Tipo de datos mostrados
BYTES
Ejemplo
En la siguiente consulta, se crea un conjunto de claves para cada fila en CustomerIds
, que puede usarse después a fin de encriptar los datos. Cada conjunto de claves contiene una sola clave de encriptación con datos de claves generados de forma aleatoria. Cada fila del resultado contiene un customer_id
y una clave 'AEAD_AES_GCM_256'
en BYTES
.
SELECT customer_id, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS keyset
FROM (
SELECT 1 AS customer_id UNION ALL
SELECT 2 UNION ALL
SELECT 3
) AS CustomerIds;
KEYS.NEW_WRAPPED_KEYSET
KEYS.NEW_WRAPPED_KEYSET(kms_resource_name, key_type)
Descripción
Crea un conjunto de claves nuevo y lo encripta con una clave de Cloud KMS.
Muestra el conjunto de claves unido como una representación de BYTES
de google.crypto.tink.Keyset que contiene una clave criptográfica principal y sin claves adicionales.
Esta función toma los siguientes argumentos:
kms_resource_name
: Una representación literal enSTRING
de la clave de Cloud KMSkms_resource_name
no puede serNULL
. La clave de Cloud KMS debe residir en la misma región de Cloud en la que se ejecuta esta función. Una clave de Cloud KMS se ve así:gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key
key_type
: Una representación literal enSTRING
del tipo de conjunto de claveskey_type
no puede serNULL
, pero puede ser uno de los siguientes valores:AEAD_AES_GCM_256
crea una clave de 256 bits con el generador de números seudoaleatorio proporcionado por boringSSL. La clave usa AES-GCM para las operaciones de encriptación y desencriptación.DETERMINISTIC_AEAD_AES_SIV_CMAC_256
: Crea una claveAES-SIV-CMAC
de 512 bits, que contiene una claveAES-CTR
de 256 bits y una claveAES-CMAC
de 256 bits. La claveAES-SIV-CMAC
se crea con el generador de números seudoaleatorios proporcionado por boringSSL. La clave usa AES-SIV para las operaciones de encriptación y desencriptación.
Tipo de datos mostrados
BYTES
Ejemplo
Coloca las siguientes variables sobre cada consulta de ejemplo que ejecutes:
DECLARE kms_resource_name STRING;
SET kms_resource_name = 'gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key';
La siguiente consulta crea un conjunto de claves unidas, que contiene el texto cifrado resultante de la encriptación de un conjunto de claves Tink con la clave de Cloud KMS especificada. Si ejecutas la consulta varias veces, genera varios conjuntos de claves unidos, y cada conjunto de claves unido es único para cada consulta que se ejecuta.
SELECT KEYS.NEW_WRAPPED_KEYSET(kms_resource_name, 'AEAD_AES_GCM_256');
Varias llamadas a esta función con los mismos argumentos en una consulta muestran el mismo valor. Por ejemplo, con la siguiente consulta, solo se crea un llavero de claves unido y se muestra para cada fila en una tabla llamada my_table
.
SELECT
*,
KEYS.NEW_WRAPPED_KEYSET(kms_resource_name, 'AEAD_AES_GCM_256')
FROM my_table
KEYS.REWRAP_KEYSET
KEYS.REWRAP_KEYSET(source_kms_resource_name, target_kms_resource_name, wrapped_keyset)
Descripción
Vuelve a encriptar un conjunto de claves unido con una clave de Cloud KMS nueva. Muestra el conjunto de claves unido como una representación de BYTES
de google.crypto.tink.Keyset que contiene una clave criptográfica principal y sin claves adicionales.
Cuando se usa esta función, source_kms_resource_name
desencripta un conjunto de claves unido y, luego, target_kms_resource_name
lo vuelve a encriptar.
Durante este proceso, el conjunto de claves desencriptado nunca es visible para los clientes.
Esta función toma los siguientes argumentos:
source_kms_resource_name
: una representación literal enSTRING
de la clave de Cloud KMS que quieres reemplazar Esta clave debe residir en la misma región de Cloud en la que se ejecuta esta función. Una clave de Cloud KMS se ve así:gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key
target_kms_resource_name
: una representación literal enSTRING
de la clave de Cloud KMS nueva que deseas usar.wrapped_keyset
: una representación literal enBYTES
del conjunto de claves que deseas volver a encriptar.
Tipo de datos mostrados
BYTES
Ejemplo
Coloca las siguientes variables sobre cada consulta de ejemplo que ejecutes:
DECLARE source_kms_resource_name STRING;
DECLARE target_kms_resource_name STRING;
DECLARE wrapped_keyset BYTES;
SET source_kms_resource_name = 'gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key';
SET target_kms_resource_name = 'gcp-kms://projects/my-project/locations/another-location/keyRings/my-key-ring/cryptoKeys/my-other-crypto-key';
SET wrapped_keyset = b'\012\044\000\107\275\360\176\264\206\332\235\215\304...';
La siguiente consulta vuelve a unir un conjunto de claves unido. Si ejecutas la consulta varias veces, genera varios conjuntos de claves unidos, y cada conjunto de claves unido es único para cada consulta que se ejecuta.
SELECT KEYS.REWRAP_KEYSET(source_kms_resource_name, target_kms_resource_name, wrapped_keyset);
Varias llamadas a esta función con los mismos argumentos en una consulta muestran el mismo valor. Por ejemplo, con la siguiente consulta, solo se crea un llavero de claves unido y se muestra para cada fila en una tabla llamada my_table
.
SELECT
*,
KEYS.REWRAP_KEYSET(source_kms_resource_name, target_kms_resource_name, wrapped_keyset)
FROM my_table
KEYS.ROTATE_KEYSET
KEYS.ROTATE_KEYSET(keyset, key_type)
Descripción
Agrega una nueva clave a keyset
en función de key_type
. Esta clave nueva se convierte en la clave criptográfica principal del nuevo conjunto de claves. Muestra el nuevo conjunto de claves serializado en BYTES
.
La antigua clave criptográfica primaria del keyset
de entrada sigue siendo una clave adicional en el conjunto de claves mostrado.
El key_type
nuevo debe coincidir con el tipo de clave existente en keyset
.
Tipo de datos mostrados
BYTES
Ejemplo
La siguiente instrucción crea una tabla que contiene una columna de valores únicos customer_id
y conjuntos de teclas 'AEAD_AES_GCM_256'
. Luego, crea una nueva clave criptográfica primaria dentro de cada conjunto de claves en la tabla fuente con KEYS.ROTATE_KEYSET
. Cada fila del resultado contiene un customer_id
y un conjunto de claves 'AEAD_AES_GCM_256'
en BYTES
.
WITH ExistingKeysets AS (
SELECT 1 AS customer_id, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS keyset
UNION ALL
SELECT 2, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') UNION ALL
SELECT 3, KEYS.NEW_KEYSET('AEAD_AES_GCM_256')
)
SELECT customer_id, KEYS.ROTATE_KEYSET(keyset, 'AEAD_AES_GCM_256') AS keyset
FROM ExistingKeysets;
KEYS.ROTATE_WRAPPED_KEYSET
KEYS.ROTATE_WRAPPED_KEYSET(kms_resource_name, wrapped_keyset, key_type)
Descripción
Toma un conjunto de claves unidos existente y muestra un conjunto de claves rotado y rellenado. El conjunto de claves unidos que se muestra es una representación de BYTES
de google.crypto.tink.Keyset.
Cuando se usa esta función, se desencripta el conjunto de claves unido, se agrega la clave nueva y, luego, se vuelve a encriptar el conjunto de claves. La clave criptográfica principal del wrapped_keyset
de entrada permanece como una clave adicional en el conjunto de claves mostrado. Durante este proceso de rotación, el conjunto de claves desencriptado nunca es visible para los clientes.
Esta función toma los siguientes argumentos:
kms_resource_name
: una representación literal enSTRING
de la clave de Cloud KMS que se usó para unir el conjunto de claves unido. La clave de Cloud KMS debe residir en la misma región de Cloud en la que se ejecuta esta función. Una clave de Cloud KMS se ve así:gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key
wrapped_keyset
: Una representación literal enBYTES
del conjunto de claves existente con el que quieres trabajar.key_type
: Una representación literal enSTRING
del tipo de conjunto de claves Debe coincidir con el tipo de clave existente enwrapped_keyset
.
Tipo de datos mostrados
BYTES
Ejemplo
Coloca las siguientes variables sobre cada consulta de ejemplo que ejecutes:
DECLARE kms_resource_name STRING;
DECLARE wrapped_keyset BYTES;
SET kms_resource_name = 'gcp-kms://projects/my-project/locations/us/keyRings/my-key-ring/cryptoKeys/my-crypto-key';
SET wrapped_keyset = b'\012\044\000\107\275\360\176\264\206\332\235\215\304...';
La siguiente consulta rota un conjunto de claves unidas. Si ejecutas la consulta varias veces, genera varios conjuntos de claves unidos, y cada conjunto de claves unido es único para cada consulta que se ejecuta.
SELECT KEYS.ROTATE_WRAPPED_KEYSET(kms_resource_name, wrapped_keyset, 'AEAD_AES_GCM_256');
Varias llamadas a esta función con los mismos argumentos en una consulta muestran el mismo valor. Por ejemplo, con la siguiente consulta, solo se crea un llavero de claves unido y se muestra para cada fila en una tabla llamada my_table
.
SELECT
*,
KEYS.ROTATE_WRAPPED_KEYSET(kms_resource_name, wrapped_keyset, 'AEAD_AES_GCM_256')
FROM my_table