How to use GCP Cloud KMS for symmetric keys

Reading Time: 3 minutes


GCP Cloud KMS is a cloud-hosted key management service that lets you manage cryptographic keys for your cloud services the same way you do on-premises. It includes support for encryption, decryption, signing, and verification using a variety of key types and sources including Cloud HSM for hardware-backed keys.

1. How to enable the Cloud KMS API

  • Sign in to Cloud Console and create a new project or reuse an existing one.
  • In this codelab you will use Cloud Shell, a free virtualized environment running on Google Cloud. From the GCP Console click the Cloud Shell icon on the top right toolbar.
  • It should only take a few moments to provision and connect to the environment. When it is finished, you should see something like this:
  • This virtual machine is loaded with all the development tools you’ll need. It offers a persistent 5GB home directory, and runs on the Google Cloud, greatly enhancing network performance and authentication. Unless otherwise instructed, run all commands from this shell.
  • Before you can use Cloud KMS, you must first enable the service in your project. This only needs to be done once per project. It can take up to a minute to enable. The command will report success when it finishes.To enable the Cloud KMS service, run the following command:
$ gcloud services enable \
    --project "${GOOGLE_CLOUD_PROJECT}"

2. Create KMS Key

  • Create a Cloud KMS Key Ring. In Cloud KMS, a Key Ring is a logical collection of cryptographic keys. The Key Ring contains metadata about the keys such as their location. Create a Key Ring named my-keyring-knoldus in the global region:
$ gcloud kms keyrings create "my-keyring-knoldus" \
    --location "global"
  • Now create a Crypto Key named my-symmetric-key with the purpose encryption inside the Key Ring you just created.
$ gcloud kms keys create "my-symmetric-key" \
    --location "global" \
    --keyring "my-keyring-knoldus" \
    --purpose "encryption"

3. Encrypt Data

  • Create a file with data to encrypt and use the gcloud command line tool to encrypt the data in the file:
$ echo "my-contents" > ./data.txt
$ gcloud kms encrypt \
    --location "global" \
    --keyring "my-keyring" \
    --key "my-symmetric-key" \
    --plaintext-file ./data.txt \
    --ciphertext-file ./data.txt.enc

The encrypted data (also known as “ciphertext”) is saved in data.txt.enc on disk. If you open the data.txt.enc file, you will notice that it has strange, unprintable characters. That is because the resulting data is in binary format.

When storing the ciphertext in a database or transmitting it as part of an HTTP request, you may need to encode the data. A common encoding mechanism is base64.

Cloud KMS does not store any of the plaintext you provide. You need to save this ciphertext in a secure location as it will be required to retrieve the plaintext value.

4. Decrypt Data

  • Decrypt the ciphertext from the file using the gcloud command line tool:
$ gcloud kms decrypt \
    --location "global" \
    --keyring "my-keyring" \
    --key "my-symmetric-key" \
    --plaintext-file - \
    --ciphertext-file ./data.txt.enc

The gcloud command-line tool reads the ciphertext from the file and decrypts it using Cloud KMS. Notice this example specifies the –plaintext-file argument as -. This instructs gcloud to print the result to the terminal.

The console will print my-contents, which is the same plaintext value from the file above.

5. Rotate Keys Manually

  • To rotate a key manually, create a new Crypto Key Version and set it as the primary version:
$ gcloud kms keys versions create \
    --location "global" \
    --keyring "my-keyring-knoldus" \
    --key "my-symmetric-key" \
  • All future requests to encrypt data will use this new key. The older keys are still available to decrypt data that was previously encrypted using those keys. Cloud KMS automatically determines the appropriate decryption key based off of the provided ciphertext .You do not have to specify which Crypto Key Version to use for decryption.
  • To prevent ciphertext values that were encrypted using an older Crypto Key Version from being decrypted using Cloud KMS, you can disable or destroy that Crypto Key Version. Disabling is a reversible operation whereas destroying is permanent. To disable a version:
$ gcloud kms keys versions disable "1" \
    --location "global" \
    --keyring "my-keyring-knoldus" \
    --key "my-symmetric-key"
Scala Future

Written by 

Sumit Agarwal is a Software Consultant having more than 1+ years of experience. He is good at problem-solving skills. He likes to watch football and cricket. He has mainly experience in Java and Mysql.