Reencriptação de dados

Este tópico mostra como voltar a encriptar dados com uma chave simétrica do Cloud Key Management Service. Pode adaptar estes exemplos para chaves assimétricas. Se suspeitar de uma utilização não autorizada de uma chave, deve voltar a encriptar os dados protegidos por essa chave e, em seguida, desativar ou agendar a destruição da versão anterior da chave.

Antes de começar

Este cenário requer as seguintes condições.

  • encriptou dados com o Cloud KMS.

  • A versão da chave usada para a encriptação não está desativada, agendada para destruição nem destruída. Usa esta versão da chave para desencriptar os dados encriptados.

  • alterou as chaves. Uma rotação de chaves cria uma nova versão da chave principal. Usa a nova versão da chave principal para voltar a encriptar os dados.

Voltar a encriptar dados com chaves assimétricas

Os exemplos neste tópico mostram como voltar a encriptar dados com uma chave simétrica. Quando usa uma chave simétrica, o Cloud KMS infere automaticamente a versão da chave a usar para a desencriptação. Quando usa uma chave assimétrica, tem de especificar a versão da chave.

O fluxo de trabalho para voltar a encriptar dados com chaves assimétricas é semelhante ao descrito neste tópico.

Fluxo de trabalho de reencriptação de dados

Siga estes passos para voltar a encriptar os dados e desativar ou agendar a destruição da versão da chave usada para a encriptação original.

  1. Desencriptar os dados com a versão da chave anterior

  2. Volte a encriptar os dados com a nova versão da chave principal

  3. Desative ou agende a destruição da versão da chave anterior

Desencripte os dados com a versão da chave anterior

O Cloud KMS usa automaticamente a versão correta da chave para desencriptar os dados, desde que a versão da chave não esteja desativada, agendada para destruição ou destruída. Os exemplos seguintes mostram como desencriptar os dados. Este é o mesmo código de desencriptação usado em Encriptar e desencriptar.

gcloud

Para usar o Cloud KMS na linha de comandos, primeiro instale ou atualize para a versão mais recente da CLI do Google Cloud.

gcloud kms decrypt \
    --key KEY_NAME \
    --keyring KEY_RING \
    --location LOCATION  \
    --ciphertext-file FILE_TO_DECRYPT \
    --plaintext-file DECRYPTED_OUTPUT

Substitua o seguinte:

  • KEY_NAME: o nome da chave que quer usar para a desencriptação.
  • KEY_RING: o nome do conjunto de chaves que contém a chave.
  • LOCATION: a localização do Cloud KMS que contém o conjunto de chaves.
  • FILE_TO_DECRYPT: o caminho para o ficheiro que quer descifrar.
  • DECRYPTED_OUTPUT: o caminho onde quer guardar o resultado descifrado.

Para ver informações sobre todas as flags e valores possíveis, execute o comando com a flag --help.

C#

Para executar este código, primeiro configure um ambiente de desenvolvimento C# e instale o SDK C# do Cloud KMS.


using Google.Cloud.Kms.V1;
using Google.Protobuf;
using System.Text;

public class DecryptSymmetricSample
{
    public string DecryptSymmetric(
      string projectId = "my-project", string locationId = "us-east1", string keyRingId = "my-key-ring", string keyId = "my-key",
      byte[] ciphertext = null)
    {
        // Create the client.
        KeyManagementServiceClient client = KeyManagementServiceClient.Create();

        // Build the key name.
        CryptoKeyName keyName = new CryptoKeyName(projectId, locationId, keyRingId, keyId);

        // Call the API.
        DecryptResponse result = client.Decrypt(keyName, ByteString.CopyFrom(ciphertext));

        // Get the plaintext. Cryptographic plaintexts and ciphertexts are
        // always byte arrays.
        byte[] plaintext = result.Plaintext.ToByteArray();

        // Return the result.
        return Encoding.UTF8.GetString(plaintext);
    }
}

Go

Para executar este código, primeiro configure um ambiente de desenvolvimento Go e instale o SDK Go do Cloud KMS.

import (
	"context"
	"fmt"
	"hash/crc32"
	"io"

	kms "cloud.google.com/go/kms/apiv1"
	"cloud.google.com/go/kms/apiv1/kmspb"
	"google.golang.org/protobuf/types/known/wrapperspb"
)

// decryptSymmetric will decrypt the input ciphertext bytes using the specified symmetric key.
func decryptSymmetric(w io.Writer, name string, ciphertext []byte) error {
	// name := "projects/my-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key"
	// ciphertext := []byte("...")  // result of a symmetric encryption call

	// Create the client.
	ctx := context.Background