En esta guía, se muestra cómo importar una clave criptográfica a Cloud Key Management Service como una versión de clave nueva con un método de importación resistente a ataques cuánticos. Este enfoque ayuda a proteger la clave durante el tránsito contra los ataques de "recolección ahora, descifrado después" (HNDL) de futuras computadoras cuánticas.
La importación de claves resistente a ataques cuánticos usa herramientas estándar de criptografía poscuántica (PQC), incluidos mecanismos de encapsulación de claves (KEM) y encriptación híbrida de clave pública (HPKE) para proteger tu clave mientras está en tránsito.
La importación de claves resistentes a ataques cuánticos es compatible con las claves respaldadas por software (nivel de protección SOFTWARE).
Antes de comenzar
Antes de importar una clave, debes preparar el proyecto, el sistema local y el material de la clave.
Prepara el proyecto
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Cloud de Confiance project.
Enable the required API.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Instala Google Cloud CLI.
-
Configura gcloud CLI para usar tu identidad federada.
Para obtener más información, consulta Accede a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
Roles obligatorios
Para obtener los permisos que necesitas para importar una clave, pídele a tu administrador que te otorgue los siguientes roles de IAM en el llavero de claves:
-
Para importar solo a claves existentes, usa Cloud KMS Importer (
roles/cloudkms.importer). -
Para importar claves nuevas:
Administrador de Cloud KMS (
roles/cloudkms.admin)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Prepara el sistema local
Necesitas una biblioteca criptográfica en tu sistema local que admita herramientas de criptografía poscuántica (PQC), incluidos los mecanismos de encapsulación de claves (KEM) y la encriptación híbrida de clave pública (HPKE). Puedes usar Tink, OpenSSL o alguna otra biblioteca criptográfica que admita lo siguiente:
- Encriptación híbrida con clave pública (HPKE)
- Uno de los siguientes algoritmos de KEM:
ML-KEM-768ML-KEM-1024X-WING(un híbrido deML-KEM-768yX25519)
- La función de derivación de claves (KDF)
HKDF-SHA256 - Encriptación autenticada con datos asociados (AEAD) que usa el algoritmo
AES-256-GCM
Prepara la llave
Verifica que el algoritmo y la longitud de tu clave sean compatibles. Todas las versiones de una clave deben tener el mismo nivel de protección (SOFTWARE).
Crea la clave de destino y el llavero de claves
Cuando importas material de clave, este se convierte en una versión de clave nueva en una clave existente. Esta clave se denomina clave de destino. El llavero de claves y la clave de destino deben existir antes de que puedas importar material de clave.
Sigue estos pasos para crear una clave vacía respaldada por software en un llavero de claves nuevo con Google Cloud CLI o la Cloud de Confiance consola.
Console
En la consola de Cloud de Confiance , ve a la página Administración de claves.
Haz clic en Crear llavero de claves.
En el campo Nombre del llavero de claves, ingresa el nombre de tu llavero de claves.
En Tipo de ubicación, selecciona un tipo de ubicación y una ubicación.
Haz clic en Crear. Se abre la página Crear clave.
Ingresa el nombre en el campo Nombre de la clave.
En Nivel de protección, selecciona Software.
En Material de clave, selecciona Clave importada y, luego, haz clic en Continuar. Esto evita que se cree una versión inicial de la clave.
Establece el Propósito y el Algoritmo de la clave y, luego, haz clic en Continuar.
Opcional: Si quieres que esta clave contenga solo versiones de claves importadas, selecciona Restringe las versiones de claves solo para la importación. Esto evita que crees accidentalmente versiones de claves nuevas en Cloud KMS.
Opcional: En el caso de las claves importadas, la rotación automática está inhabilitada de forma predeterminada. Para habilitar la rotación automática, selecciona un valor en el campo Período de rotación de claves.
Si habilitas la rotación automática, se generarán nuevas versiones de la clave en Cloud KMS, y la versión de la clave importada ya no será la versión predeterminada de la clave después de una rotación.
Haz clic en Crear.
gcloud
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de Google Cloud CLI.
Crea el llavero de claves de destino. Elige una ubicación que sea compatible con el nivel de protección que deseas usar. Para obtener más información sobre las ubicaciones admitidas, consulta Ubicaciones de Cloud KMS.
gcloud kms keyrings create KEY_RING \ --location LOCATION
Obtén más información para crear llaveros de claves.
Crea la clave de destino con el comando
kms keys createy la marca--skip-initial-version-creation. Esto crea una clave sin una versión inicial para que el material de clave importado sea la versión1. Usa la marca--import-onlypara evitar que Cloud KMS genere material de claves para las versiones de claves nuevas. Si se establece esta marca, se deben importar versiones de clave nuevas para esta clave. Las claves creadas como--import-onlydeben rotarse manualmente.gcloud kms keys create KEY_NAME \ --location LOCATION \ --keyring KEY_RING \ --purpose PURPOSE \ --skip-initial-version-creation \ --import-only
Reemplaza lo siguiente:
KEY_NAME: Es el nombre que deseas usar para la clave.LOCATION: Es la ubicación del llavero de claves.KEY_RING: Es el llavero de claves en el que deseas crear la clave.PURPOSE: Es el propósito que deseas usar para la clave.
API
En estos ejemplos, se usa curl como un cliente HTTP para demostrar el uso de la API. Para obtener más información sobre el control de acceso, consulta Accede a la API de Cloud KMS.
Crea un llavero de claves nuevo:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings?keyRingId=KEY_RING" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --header "x-goog-user-project: PROJECT_ID" \ --data "{}"Consulta la documentación de la API de
KeyRing.createpara obtener más información.Crea una clave vacía de solo importación:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys?cryptoKeyId=KEY_NAME&skipInitialVersionCreation=true" \ --request "POST" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --header "x-goog-user-project: PROJECT_ID" \ --data "{"purpose":"PURPOSE", "importOnly": "true", "versionTemplate":{"protectionLevel":"PROTECTION_LEVEL","algorithm":"ALGORITHM"}}"Consulta la documentación de la API de
CryptoKey.createpara obtener más información.
El llavero de claves y la clave se crearon, pero la clave no contiene material, no tiene versión y no está activa. Luego, crea un trabajo de importación.
Crea el trabajo de importación
Un trabajo de importación define las características de las claves que importa, incluido el nivel de protección y el método de importación.
La importación de claves resistentes a ataques cuánticos solo se admite para el nivel de protección SOFTWARE.
Elige uno de los siguientes métodos de importación resistentes a ataques cuánticos:
HPKE_KEM_XWING_HKDF_SHA256_AES_256_GCMHPKE_KEM_ML_KEM_768_HKDF_SHA256_AES_256_GCMHPKE_KEM_ML_KEM_1024_HKDF_SHA256_AES_256_GCM
gcloud
Ejecuta el siguiente comando para crear un trabajo de importación con un método de importación resistente a ataques cuánticos:
gcloud kms import-jobs create IMPORT_JOB \
--location LOCATION \
--keyring KEY_RING \
--import-method IMPORT_METHOD \
--protection-level software
Reemplaza lo siguiente:
IMPORT_JOB: Es un nombre único para usar en el trabajo de importación.LOCATION: Es la ubicación del llavero de claves en el que creaste la clave de destino.KEY_RING: Es el nombre del llavero de claves en el que creaste la clave de destino.IMPORT_METHOD: Es el método de importación resistente a ataques cuánticos que deseas usar, por ejemplo,hpke-kem-xwing-hkdf-sha256-aes-256-gcm.
REST
Llama al método keyRings.importJobs.create de la siguiente forma:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/importJobs?import_job_id=IMPORT_JOB" \
--request "POST" \
--header "authorization: Bearer TOKEN" \
--header "content-type: application/json" \
--data '{"import_method": "IMPORT_METHOD", "protection_level": "SOFTWARE"}'
Reemplaza lo siguiente:
PROJECT_ID: Es el identificador de tu proyecto de Cloud KMS.LOCATION: Es la ubicación del llavero de claves en el que creaste la clave de destino.KEY_RING: Es el nombre del llavero de claves en el que creaste la clave de destino.IMPORT_JOB: Es un nombre único para usar en el trabajo de importación.TOKEN: Es el token para autenticar la solicitud.IMPORT_METHOD: Es el método de importación resistente a ataques cuánticos que deseas usar, por ejemplo,HPKE_KEM_XWING_HKDF_SHA256_AES_256_GCM.
Verifica el estado del trabajo de importación
El estado inicial de un trabajo de importación es PENDING_GENERATION. Cuando el estado es ACTIVE, puedes usarlo para importar claves.
Un trabajo de importación vence después de tres días. Si el trabajo de importación venció, debes crear uno nuevo.
Puedes comprobar el estado de un trabajo de importación con Google Cloud CLI, la consola deCloud de Confiance o la API de Cloud Key Management Service.
Console
Ve a la página Administración de claves en la consola de Cloud de Confiance .
Haz clic en el nombre del llavero de claves que contiene tu trabajo de importación.
Haz clic en la pestaña Trabajos de importación en la parte superior de la página.
El estado aparecerá en Estado junto al nombre de tu trabajo de importación.
gcloud
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de Google Cloud CLI.
Cuando un trabajo de importación está activo, puedes usarlo para importar claves. Este proceso puede tardar unos minutos. Usa este comando para verificar que el trabajo de importación esté activo. Usa la ubicación y el llavero de claves en los que creaste el trabajo de importación.
gcloud kms import-jobs describe IMPORT_JOB \ --location LOCATION \ --keyring KEY_RING \ --format="value(state)"
El resultado es similar a lo siguiente:
state: ACTIVE
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Cloud KMS.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Cloud KMS.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Cloud KMS.
Python
Para ejecutar este código, primero configura un entorno de desarrollo de Python y, luego, instala el SDK de Python para Cloud KMS.
API
En estos ejemplos, se usa curl como un cliente HTTP para demostrar el uso de la API. Para obtener más información sobre el control de acceso, consulta Accede a la API de Cloud KMS.
Para verificar el estado de un trabajo de importación, usa el método ImportJobs.get:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/importJobs/IMPORT_JOB_ID" \
--request "GET" \
--header "authorization: Bearer TOKEN"
En cuanto el trabajo de importación esté activo, puedes realizar una solicitud para importar una clave.
Recupera la clave de unión pública
Después de que el trabajo de importación esté en estado ACTIVE, recupera la clave pública asociada a él. Usarás esta clave pública en tu sistema local para unir el material de claves que deseas importar.
gcloud
Ejecuta el siguiente comando para descargar la clave pública:
gcloud kms import-jobs describe IMPORT_JOB
--location LOCATION
--keyring KEY_RING
--format="value(publicKey.data)"
Reemplaza lo siguiente:
IMPORT_JOB: Es el nombre del trabajo de importación.LOCATION: Es la ubicación del llavero de claves en el que creaste el trabajo de importación.KEY_RING: Es el nombre del llavero de claves en el que creaste el trabajo de importación.
La clave pública está codificada en Base64.
REST
- Llama al método
keyRings.importJobs.get. - Recupera la clave pública del campo
publicKey.datade la respuesta y guárdala de forma local comopublic_key.data.
Prepara y une el material de clave
Usa una biblioteca criptográfica externa compatible en tu sistema local para unir el material de claves con la clave de unión pública recuperada.
El proceso de unión debe realizar HPKE.Seal() (RFC 9180) para producir una clave unida. Con esto, se completan los siguientes pasos:
- Encapsula la clave pública recuperada para producir una clave de encapsulación y un secreto compartido.
- Deriva una clave simétrica efímera del secreto compartido con HKDF-SHA256.
- Encripta tu material de clave con la clave efímera usando AES-256-GCM.
- Concatena la clave de encapsulación y el material de clave encriptado como texto cifrado. Esta es la clave unida resultante que usarás para importar la clave. Guarda este archivo como
wrapped_key.bin.
En el siguiente muestra de código en Go, se muestra cómo encapsular material de claves con la biblioteca tink-go:
package main
import (
"bytes"
"encoding/base64"
"flag"
"fmt"
"log"
"google.golang.org/protobuf/proto"
"github.com/tink-crypto/tink-go/v2/hybrid"
"github.com/tink-crypto/tink-go/v2/keyset"
hpkepb "github.com/tink-crypto/tink-go/v2/proto/hpke_go_proto"
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
)
var (
publicKeyB64Flag = flag.String("public_key", "", "Base64 encoded public key for wrapping.")
targetKeyB64Flag = flag.String("target_key", "", "Base64 encoded 32-byte target key to be wrapped.")
)
func main() {
flag.Parse()
if *publicKeyB64Flag == "" {
log.Fatal("-public_key is required")
}
if *targetKeyB64Flag == "" {
log.Fatal("-target_key is required")
}
pkBytes, err := base64.StdEncoding.DecodeString(*publicKeyB64Flag)
if err != nil {
log.Fatalf("failed to decode public key: %v", err)
}
targetKey, err := base64.StdEncoding.DecodeString(*targetKeyB64Flag)
if err != nil {
log.Fatalf("failed to decode target key: %v", err)
}
hpkePubKey := &hpkepb.HpkePublicKey{
Version: 0,
Params: &hpkepb.HpkeParams{
Kem: hpkepb.HpkeKem_ML_KEM768,
Kdf: hpkepb.HpkeKdf_HKDF_SHA256,
Aead: hpkepb.HpkeAead_AES_256_GCM,
},
PublicKey: pkBytes,
}
serializedPubKey, err := proto.Marshal(hpkePubKey)
if err != nil {
log.Fatalf("failed to marshal HPKE public key: %v", err)
}
ks := &tinkpb.Keyset{
PrimaryKeyId: 1,
Key: []*tinkpb.Keyset_Key{
{
KeyData: &tinkpb.KeyData{
TypeUrl: "type.googleapis.com/google.crypto.tink.HpkePublicKey",
Value: serializedPubKey,
KeyMaterialType: tinkpb.KeyData_ASYMMETRIC_PUBLIC,
},
Status: tinkpb.KeyStatusType_ENABLED,
KeyId: 1,
OutputPrefixType: tinkpb.OutputPrefixType_RAW,
},
},
}
serializedKeyset, err := proto.Marshal(ks)
if err != nil {
log.Fatalf("failed to marshal keyset: %v", err)
}
// Create a KeysetHandle and retrieve the HybridEncrypt primitive.
reader := keyset.NewBinaryReader(bytes.NewReader(serializedKeyset))
handle, err := keyset.ReadWithNoSecrets(reader)
if err != nil {
log.Fatalf("failed to create keyset handle: %v", err)
}
enc, err := hybrid.NewHybridEncrypt(handle)
if err != nil {
log.Fatalf("failed to create hybrid encrypt primitive: %v", err)
}
// Perform the wrapping operation. Tink's HPKE implementation handles the
// 'enc || ciphertext' concatenation automatically.
wrappedKey, err := enc.Encrypt(targetKey, nil)
if err != nil {
log.Fatalf("failed to wrap key: %v", err)
}
fmt.Printf("Final wrappedKey (base64):\n%s\n", base64.StdEncoding.EncodeToString(wrappedKey))
}
Guarda la cadena de Base64 de salida o decodifícala en un archivo binario:
bash
echo "BASE64_WRAPPED_KEY" | base64 --decode > wrapped_key.bin
Importa la clave unida
Importa la clave unida preparada como una versión de clave nueva de tu clave de destino.
gcloud
Ejecuta el comando kms keys versions import:
gcloud kms keys versions import \
--location LOCATION \
--keyring KEY_RING \
--key KEY_NAME \
--import-job IMPORT_JOB \
--algorithm ALGORITHM \
--wrapped-key-file wrapped_key.bin
Reemplaza lo siguiente:
LOCATION: Es la ubicación del llavero de claves que contiene la clave de destino.KEY_RING: Es el nombre del llavero de claves que contiene la clave de destino.KEY_NAME: Es el nombre de la clave de destino.IMPORT_JOB: Es el nombre de tu trabajo de importación.ALGORITHM: Es el algoritmo del material de la clave que se importará.
REST
Llama al método cryptoKeyVersions.import de la siguiente forma:
curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions:import" \
--request "POST" \
--header "authorization: Bearer TOKEN" \
--header "content-type: application/json" \
--data '{"importJob": "IMPORT_JOB", "algorithm": "ALGORITHM", "wrappedKey": "PATH_TO_WRAPPED_KEY"}'
Reemplaza lo siguiente:
PROJECT_ID: Es el identificador de tu proyecto de Cloud KMS.LOCATION: Es la ubicación del llavero de claves que contiene la clave de destino.KEY_RING: Es el nombre del llavero de claves que contiene la clave de destino.KEY_NAME: Es el nombre de la clave de destino.TOKEN: Es el token para autenticar la solicitud.IMPORT_JOB: Es el identificador del trabajo de importación correspondiente.ALGORITHM: Es el algoritmo del material de la clave que se importará.PATH_TO_WRAPPED_KEY: Es la ruta de acceso a la clave ajustada manualmente en formato base64.
Verifica el estado de la versión de clave importada
El estado inicial de una versión de clave importada es PENDING_IMPORT. Cuando el estado es ENABLED, significa que la versión de clave se importó correctamente. Si falla la importación, el estado es IMPORT_FAILED.
Puedes comprobar el estado de una solicitud de importación con Google Cloud CLI, la consola deCloud de Confiance o la API de Cloud Key Management Service.
Console
Abre la página Administración de claves en la consola deCloud de Confiance .
Haz clic en el nombre del llavero de claves que contiene tu trabajo de importación.
Haz clic en la pestaña Trabajos de importación en la parte superior de la página.
El estado aparecerá en Estado junto al nombre de tu trabajo de importación.
gcloud
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de Google Cloud CLI.
Usa el comando versions list para verificar el estado. Usa la misma ubicación, el llavero de claves de destino y la clave de destino que creaste antes en este tema.
gcloud kms keys versions list \ --keyring KEY_RING \ --location LOCATION \ --key KEY_NAME
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Cloud KMS.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Cloud KMS.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Cloud KMS.
Python
Para ejecutar este código, primero configura un entorno de desarrollo de Python y, luego, instala el SDK de Python para Cloud KMS.
API
En estos ejemplos, se usa curl como un cliente HTTP para demostrar el uso de la API. Para obtener más información sobre el control de acceso, consulta Accede a la API de Cloud KMS.
Llama al método ImportJob.get y verifica el campo [state][api_importjob_fields_state]. Si state es PENDING_GENERATION, el trabajo de importación todavía se está creando.
Vuelve a verificar periódicamente el estado hasta que sea ACTIVE.
Después de importar la versión de clave inicial, el estado de la clave cambia a ENABLED. En el caso de las claves simétricas, debes configurar la versión de la clave importada como la versión principal antes de poder usar la clave.
Vuelve a importar una clave destruida previamente
Si necesitas restablecer una versión de clave importada previamente que se encuentra en estado DESTROYED o IMPORT_FAILED al estado ENABLED, puedes volver a importar el mismo material de clave.
Para volver a importar una versión de clave destruida, se usa el mismo procedimiento que para la importación inicial, ya sea con el trabajo de importación original o con uno nuevo (con el mismo nivel de protección SOFTWARE).