本主题介绍如何使用 Cloud Key Management Service 对称密钥重新加密数据。 您可以根据非对称密钥调整这些示例。 如果您怀疑存在未经授权使用密钥的情况,则应当重新加密受该密钥保护的数据,然后停用或安排销毁先前的密钥版本。
准备工作
此场景需要以下条件。
您已使用 Cloud KMS 加密了数据。
用于加密的密钥版本并非处于已停用、计划销毁或已销毁状态。您使用此密钥版本对已加密的数据进行解密。
使用非对称密钥重新加密数据
本主题中的示例展示了如何使用对称密钥重新加密数据。 当您使用对称密钥时,Cloud KMS 会自动推断用于解密的密钥版本。使用非对称密钥时,您必须指定密钥版本。
- 按照
gcloud
命令行工具的使用说明操作时,请始终添加--version
标志。 - 按照 API 的使用说明操作时,请使用
CryptoKeyVersions
而不是CryptoKeys
。您可以详细了解如何使用非对称密钥对数据进行加密和解密。
使用非对称密钥重新加密数据的工作流程类似于本主题中介绍的工作流程。
重新加密数据工作流程
使用以下步骤,重新加密数据并停用或安排销毁最初用于加密的密钥版本。
使用先前的密钥版本解密数据
Cloud KMS 会自动使用正确的密钥版本解密数据,前提是该密钥版本并非处于已停用、已安排销毁或已销毁状态。以下示例显示了如何解密数据。 示例与加密和解密使用的解密代码相同。
命令行
要在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Cloud SDK。
gcloud kms decrypt \ --key key \ --keyring key-ring \ --location location \ --ciphertext-file file-path-with-encrypted-data \ --plaintext-file file-path-to-store-plaintext
将 key 替换为要用于解密的密钥的名称。将 key-ring 替换为密钥将要存放到的密钥环的名称。将 location 替换为密钥环的 Cloud KMS 位置。将 file-path-with-encrypted-data 和 file-path-to-store-plaintext 替换为本地文件路径,以读取加密数据并保存解密输出。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
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
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
import (
"context"
"fmt"
"hash/crc32"
"io"
kms "cloud.google.com/go/kms/apiv1"
kmspb "google.golang.org/genproto/googleapis/cloud/kms/v1"
"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()
client, err := kms.NewKeyManagementClient(ctx)
if err != nil {
return fmt.Errorf("failed to create kms client: %v", err)
}
// Optional, but recommended: Compute ciphertext's CRC32C.
crc32c := func(data []byte) uint32 {
t := crc32.MakeTable(crc32.Castagnoli)
return crc32.Checksum(data, t)
}
ciphertextCRC32C := crc32c(ciphertext)
// Build the request.
req := &kmspb.DecryptRequest{
Name: name,
Ciphertext: ciphertext,
CiphertextCrc32C: wrapperspb.Int64(int64(ciphertextCRC32C)),
}
// Call the API.
result, err := client.Decrypt(ctx, req)
if err != nil {
return fmt.Errorf("failed to decrypt ciphertext: %v", err)
}
// Optional, but recommended: perform integrity verification on result.
// For more details on ensuring E2E in-transit integrity to and from Cloud KMS visit:
// https://cloud.google.com/kms/docs/data-integrity-guidelines
if int64(crc32c(result.Plaintext)) != result.PlaintextCrc32C.Value {
return fmt.Errorf("Decrypt: response corrupted in-transit")
}
fmt.Fprintf(w, "Decrypted plaintext: %s", result.Plaintext)
return nil
}
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
import com.google.cloud.kms.v1.CryptoKeyName;
import com.google.cloud.kms.v1.DecryptResponse;
import com.google.cloud.kms.v1.KeyManagementServiceClient;
import com.google.protobuf.ByteString;
import java.io.IOException;
public class DecryptSymmetric {
public void decryptSymmetric() throws IOException {
// TODO(developer): Replace these variables before running the sample.
String projectId = "your-project-id";
String locationId = "us-east1";
String keyRingId = "my-key-ring";
String keyId = "my-key";
byte[] ciphertext = null;
decryptSymmetric(projectId, locationId, keyRingId, keyId, ciphertext);
}
// Decrypt data that was encrypted using a symmetric key.
public void decryptSymmetric(
String projectId, String locationId, String keyRingId, String keyId, byte[] ciphertext)
throws IOException {
// Initialize client that will be used to send requests. This client only
// needs to be created once, and can be reused for multiple requests. After
// completing all of your requests, call the "close" method on the client to
// safely clean up any remaining background resources.
try (KeyManagementServiceClient client = KeyManagementServiceClient.create()) {
// Build the key version name from the project, location, key ring, and
// key.
CryptoKeyName keyName = CryptoKeyName.of(projectId, locationId, keyRingId, keyId);
// Decrypt the response.
DecryptResponse response = client.decrypt(keyName, ByteString.copyFrom(ciphertext));
System.out.printf("Plaintext: %s%n", response.getPlaintext().toStringUtf8());
}
}
}
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
//
// TODO(developer): Uncomment these variables before running the sample.
//
// const projectId = 'my-project';
// const locationId = 'us-east1';
// const keyRingId = 'my-key-ring';
// const keyId = 'my-key';
// const ciphertext = Buffer.from('...');
// Imports the Cloud KMS library
const {KeyManagementServiceClient} = require('@google-cloud/kms');
// Instantiates a client
const client = new KeyManagementServiceClient();
// Build the key name
const keyName = client.cryptoKeyPath(projectId, locationId, keyRingId, keyId);
// Optional, but recommended: compute ciphertext's CRC32C.
const crc32c = require('fast-crc32c');
const ciphertextCrc32c = crc32c.calculate(ciphertext);
async function decryptSymmetric() {
const [decryptResponse] = await client.decrypt({
name: keyName,
ciphertext: ciphertext,
ciphertextCrc32c: {
value: ciphertextCrc32c,
},
});
// Optional, but recommended: perform integrity verification on decryptResponse.
// For more details on ensuring E2E in-transit integrity to and from Cloud KMS visit:
// https://cloud.google.com/kms/docs/data-integrity-guidelines
if (
crc32c.calculate(decryptResponse.plaintext) !==
Number(decryptResponse.plaintextCrc32c.value)
) {
throw new Error('Decrypt: response corrupted in-transit');
}
const plaintext = decryptResponse.plaintext.toString('utf8');
console.log(`Plaintext: ${plaintext}`);
return plaintext;
}
return decryptSymmetric();
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
use Google\Cloud\Kms\V1\KeyManagementServiceClient;
function decrypt_symmetric_sample(
string $projectId = 'my-project',
string $locationId = 'us-east1',
string $keyRingId = 'my-key-ring',
string $keyId = 'my-key',
string $ciphertext = '...'
) {
// Create the Cloud KMS client.
$client = new KeyManagementServiceClient();
// Build the key name.
$keyName = $client->cryptoKeyName($projectId, $locationId, $keyRingId, $keyId);
// Call the API.
$decryptResponse = $client->decrypt($keyName, $ciphertext);
printf('Plaintext: %s' . PHP_EOL, $decryptResponse->getPlaintext());
return $decryptResponse;
}
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
def decrypt_symmetric(project_id, location_id, key_ring_id, key_id, ciphertext):
"""
Decrypt the ciphertext using the symmetric key
Args:
project_id (string): Google Cloud project ID (e.g. 'my-project').
location_id (string): Cloud KMS location (e.g. 'us-east1').
key_ring_id (string): ID of the Cloud KMS key ring (e.g. 'my-key-ring').
key_id (string): ID of the key to use (e.g. 'my-key').
ciphertext (bytes): Encrypted bytes to decrypt.
Returns:
DecryptResponse: Response including plaintext.
"""
# Import the client library.
from google.cloud import kms
# Create the client.
client = kms.KeyManagementServiceClient()
# Build the key name.
key_name = client.crypto_key_path(project_id, location_id, key_ring_id, key_id)
# Optional, but recommended: compute ciphertext's CRC32C.
# See crc32c() function defined below.
ciphertext_crc32c = crc32c(ciphertext)
# Call the API.
decrypt_response = client.decrypt(
request={'name': key_name, 'ciphertext': ciphertext, 'ciphertext_crc32c': ciphertext_crc32c})
# Optional, but recommended: perform integrity verification on decrypt_response.
# For more details on ensuring E2E in-transit integrity to and from Cloud KMS visit:
# https://cloud.google.com/kms/docs/data-integrity-guidelines
if not decrypt_response.plaintext_crc32c == crc32c(decrypt_response.plaintext):
raise Exception('The response received from the server was corrupted in-transit.')
# End integrity verification
print('Plaintext: {}'.format(decrypt_response.plaintext))
return decrypt_response
def crc32c(data):
"""
Calculates the CRC32C checksum of the provided data.
Args:
data: the bytes over which the checksum should be calculated.
Returns:
An int representing the CRC32C checksum of the provided bytes.
"""
import crcmod
import six
crc32c_fun = crcmod.predefined.mkPredefinedCrcFun('crc-32c')
return crc32c_fun(six.ensure_binary(data))
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
# TODO(developer): uncomment these values before running the sample.
# project_id = "my-project"
# location_id = "us-east1"
# key_ring_id = "my-key-ring"
# key_id = "my-key"
# ciphertext = "..."
# Require the library.
require "google/cloud/kms"
# Create the client.
client = Google::Cloud::Kms.key_management_service
# Build the parent key name.
key_name = client.crypto_key_path project: project_id,
location: location_id,
key_ring: key_ring_id,
crypto_key: key_id
# Call the API.
response = client.decrypt name: key_name, ciphertext: ciphertext
puts "Plaintext: #{response.plaintext}"
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
从 Cloud KMS 中以 JSON 格式返回的解密后文本使用 base64 进行编码。
要对加密数据进行解密,请发出 POST
请求并提供相应的项目和密钥信息,并在请求正文的 ciphertext
字段中指定要解密的加密(密文)文本。
curl "https://cloudkms.googleapis.com/v1/projects/project-id/locations/location/keyRings/key-ring-name/cryptoKeys/key-name:decrypt" \ --request "POST" \ --header "authorization: Bearer token" \ --header "content-type: application/json" \ --data "{\"ciphertext\": \"encrypted-content\"}"
以下是包含 base64 编码数据的示例载荷:
{ "ciphertext": "CiQAhMwwBo61cHas7dDgifrUFs5zNzBJ2uZtVFq4ZPEl6fUVT4kSmQ...", }
使用新的主密钥版本重新加密数据
Cloud KMS 自动使用新的主密钥版本来加密数据。以下示例显示了如何加密数据。示例与加密和解密中使用的加密代码相同。
命令行
要在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Cloud SDK。
gcloud kms encrypt \ --key key \ --keyring key-ring \ --location location \ --plaintext-file file-with-data-to-encrypt \ --ciphertext-file file-to-store-encrypted-data
将 key 替换为用于加密的密钥的名称。将 key-ring 替换为密钥所在的密钥环的名称。将 location 替换为密钥环的 Cloud KMS 位置。将 file-with-data-to-encrypt 和 file-to-store-encrypted-data 替换为本地文件路径,以读取明文数据并保存加密输出。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
using Google.Cloud.Kms.V1;
using Google.Protobuf;
using System.Text;
public class EncryptSymmetricSample
{
public byte[] EncryptSymmetric(
string projectId = "my-project", string locationId = "us-east1", string keyRingId = "my-key-ring", string keyId = "my-key",
string message = "Sample message")
{
// Create the client.
KeyManagementServiceClient client = KeyManagementServiceClient.Create();
// Build the key name.
CryptoKeyName keyName = new CryptoKeyName(projectId, locationId, keyRingId, keyId);
// Convert the message into bytes. Cryptographic plaintexts and
// ciphertexts are always byte arrays.
byte[] plaintext = Encoding.UTF8.GetBytes(message);
// Call the API.
EncryptResponse result = client.Encrypt(keyName, ByteString.CopyFrom(plaintext));
// Return the ciphertext.
return result.Ciphertext.ToByteArray();
}
}
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
import (
"context"
"fmt"
"hash/crc32"
"io"
kms "cloud.google.com/go/kms/apiv1"
kmspb "google.golang.org/genproto/googleapis/cloud/kms/v1"
"google.golang.org/protobuf/types/known/wrapperspb"
)
// encryptSymmetric encrypts the input plaintext with the specified symmetric
// Cloud KMS key.
func encryptSymmetric(w io.Writer, name string, message string) error {
// name := "projects/my-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key"
// message := "Sample message"
// Create the client.
ctx := context.Background()
client, err := kms.NewKeyManagementClient(ctx)
if err != nil {
return fmt.Errorf("failed to create kms client: %v", err)
}
// Convert the message into bytes. Cryptographic plaintexts and
// ciphertexts are always byte arrays.
plaintext := []byte(message)
// Optional but recommended: Compute plaintext's CRC32C.
crc32c := func(data []byte) uint32 {
t := crc32.MakeTable(crc32.Castagnoli)
return crc32.Checksum(data, t)
}
plaintextCRC32C := crc32c(plaintext)
// Build the request.
req := &kmspb.EncryptRequest{
Name: name,
Plaintext: plaintext,
PlaintextCrc32C: wrapperspb.Int64(int64(plaintextCRC32C)),
}
// Call the API.
result, err := client.Encrypt(ctx, req)
if err != nil {
return fmt.Errorf("failed to encrypt: %v", err)
}
// Optional, but recommended: perform integrity verification on result.
// For more details on ensuring E2E in-transit integrity to and from Cloud KMS visit:
// https://cloud.google.com/kms/docs/data-integrity-guidelines
if result.VerifiedPlaintextCrc32C == false {
return fmt.Errorf("Encrypt: request corrupted in-transit")
}
if int64(crc32c(result.Ciphertext)) != result.CiphertextCrc32C.Value {
return fmt.Errorf("Encrypt: response corrupted in-transit")
}
fmt.Fprintf(w, "Encrypted ciphertext: %s", result.Ciphertext)
return nil
}
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
import com.google.cloud.kms.v1.CryptoKeyName;
import com.google.cloud.kms.v1.EncryptResponse;
import com.google.cloud.kms.v1.KeyManagementServiceClient;
import com.google.protobuf.ByteString;
import java.io.IOException;
public class EncryptSymmetric {
public void encryptSymmetric() throws IOException {
// TODO(developer): Replace these variables before running the sample.
String projectId = "your-project-id";
String locationId = "us-east1";
String keyRingId = "my-key-ring";
String keyId = "my-key";
String plaintext = "Plaintext to encrypt";
encryptSymmetric(projectId, locationId, keyRingId, keyId, plaintext);
}
// Encrypt data with a given key.
public void encryptSymmetric(
String projectId, String locationId, String keyRingId, String keyId, String plaintext)
throws IOException {
// Initialize client that will be used to send requests. This client only
// needs to be created once, and can be reused for multiple requests. After
// completing all of your requests, call the "close" method on the client to
// safely clean up any remaining background resources.
try (KeyManagementServiceClient client = KeyManagementServiceClient.create()) {
// Build the key version name from the project, location, key ring, key,
// and key version.
CryptoKeyName keyVersionName = CryptoKeyName.of(projectId, locationId, keyRingId, keyId);
// Encrypt the plaintext.
EncryptResponse response = client.encrypt(keyVersionName, ByteString.copyFromUtf8(plaintext));
System.out.printf("Ciphertext: %s%n", response.getCiphertext().toStringUtf8());
}
}
}
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
//
// TODO(developer): Uncomment these variables before running the sample.
//
// const projectId = 'my-project';
// const locationId = 'us-east1';
// const keyRingId = 'my-key-ring';
// const keyId = 'my-key';
// const plaintextBuffer = Buffer.from('...');
// Imports the Cloud KMS library
const {KeyManagementServiceClient} = require('@google-cloud/kms');
// Instantiates a client
const client = new KeyManagementServiceClient();
// Build the key name
const keyName = client.cryptoKeyPath(projectId, locationId, keyRingId, keyId);
// Optional, but recommended: compute plaintext's CRC32C.
const crc32c = require('fast-crc32c');
const plaintextCrc32c = crc32c.calculate(plaintextBuffer);
async function encryptSymmetric() {
const [encryptResponse] = await client.encrypt({
name: keyName,
plaintext: plaintextBuffer,
plaintextCrc32c: {
value: plaintextCrc32c,
},
});
const ciphertext = encryptResponse.ciphertext;
// Optional, but recommended: perform integrity verification on encryptResponse.
// For more details on ensuring E2E in-transit integrity to and from Cloud KMS visit:
// https://cloud.google.com/kms/docs/data-integrity-guidelines
if (!encryptResponse.verifiedPlaintextCrc32c) {
throw new Error('Encrypt: request corrupted in-transit');
}
if (
crc32c.calculate(ciphertext) !==
Number(encryptResponse.ciphertextCrc32c.value)
) {
throw new Error('Encrypt: response corrupted in-transit');
}
console.log(`Ciphertext: ${ciphertext.toString('base64')}`);
return ciphertext;
}
return encryptSymmetric();
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
use Google\Cloud\Kms\V1\KeyManagementServiceClient;
function encrypt_symmetric_sample(
string $projectId = 'my-project',
string $locationId = 'us-east1',
string $keyRingId = 'my-key-ring',
string $keyId = 'my-key',
string $plaintext = '...'
) {
// Create the Cloud KMS client.
$client = new KeyManagementServiceClient();
// Build the key name.
$keyName = $client->cryptoKeyName($projectId, $locationId, $keyRingId, $keyId);
// Call the API.
$encryptResponse = $client->encrypt($keyName, $plaintext);
printf('Ciphertext: %s' . PHP_EOL, $encryptResponse->getCiphertext());
return $encryptResponse;
}
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
def encrypt_symmetric(project_id, location_id, key_ring_id, key_id, plaintext):
"""
Encrypt plaintext using a symmetric key.
Args:
project_id (string): Google Cloud project ID (e.g. 'my-project').
location_id (string): Cloud KMS location (e.g. 'us-east1').
key_ring_id (string): ID of the Cloud KMS key ring (e.g. 'my-key-ring').
key_id (string): ID of the key to use (e.g. 'my-key').
plaintext (string): message to encrypt
Returns:
bytes: Encrypted ciphertext.
"""
# Import the client library.
from google.cloud import kms
# Import base64 for printing the ciphertext.
import base64
# Convert the plaintext to bytes.
plaintext_bytes = plaintext.encode('utf-8')
# Optional, but recommended: compute plaintext's CRC32C.
# See crc32c() function defined below.
plaintext_crc32c = crc32c(plaintext_bytes)
# Create the client.
client = kms.KeyManagementServiceClient()
# Build the key name.
key_name = client.crypto_key_path(project_id, location_id, key_ring_id, key_id)
# Call the API.
encrypt_response = client.encrypt(
request={'name': key_name, 'plaintext': plaintext_bytes, 'plaintext_crc32c': plaintext_crc32c})
# Optional, but recommended: perform integrity verification on encrypt_response.
# For more details on ensuring E2E in-transit integrity to and from Cloud KMS visit:
# https://cloud.google.com/kms/docs/data-integrity-guidelines
if not encrypt_response.verified_plaintext_crc32c:
raise Exception('The request sent to the server was corrupted in-transit.')
if not encrypt_response.ciphertext_crc32c == crc32c(encrypt_response.ciphertext):
raise Exception('The response received from the server was corrupted in-transit.')
# End integrity verification
print('Ciphertext: {}'.format(base64.b64encode(encrypt_response.ciphertext)))
return encrypt_response
def crc32c(data):
"""
Calculates the CRC32C checksum of the provided data.
Args:
data: the bytes over which the checksum should be calculated.
Returns:
An int representing the CRC32C checksum of the provided bytes.
"""
import crcmod
import six
crc32c_fun = crcmod.predefined.mkPredefinedCrcFun('crc-32c')
return crc32c_fun(six.ensure_binary(data))
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
# TODO(developer): uncomment these values before running the sample.
# project_id = "my-project"
# location_id = "us-east1"
# key_ring_id = "my-key-ring"
# key_id = "my-key"
# plaintext = "..."
# Require the library.
require "google/cloud/kms"
# Create the client.
client = Google::Cloud::Kms.key_management_service
# Build the parent key name.
key_name = client.crypto_key_path project: project_id,
location: location_id,
key_ring: key_ring_id,
crypto_key: key_id
# Call the API.
response = client.encrypt name: key_name, plaintext: plaintext
puts "Ciphertext: #{Base64.strict_encode64 response.ciphertext}"
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
使用 JSON 和 REST API 时,内容必须先进行 base-64 编码,然后才能由 Cloud KMS 加密。
要加密数据,请发出 POST
请求并提供相应的项目和密钥信息,并在请求正文的 plaintext
字段中指定要加密的 base64 编码文本。
curl "https://cloudkms.googleapis.com/v1/projects/project-id/locations/location/keyRings/key-ring-name/cryptoKeys/key-name:encrypt" \ --request "POST" \ --header "authorization: Bearer token" \ --header "content-type: application/json" \ --data "{\"plaintext\": \"base64-encoded-input\"}"
以下是包含 base64 编码数据的示例载荷:
{ "plaintext": "U3VwZXIgc2VjcmV0IHRleHQgdGhhdCBtdXN0IGJlIGVuY3J5cHRlZAo=", }
停用或安排销毁先前的密钥版本
如果您为了响应可疑突发事件而轮替密钥,重新加密数据后,请停用或安排销毁先前的密钥版本。
停用已启用的密钥版本
只有已启用的密钥版本才能被停用。您可以通过 UpdateCryptoKeyVersion
方法实现这一目的。
网页界面
转到 Cloud Console 中的加密密钥页面。
点击您将停用其密钥版本的密钥所在密钥环的名称。
点击您要停用其密钥版本的密钥。
选中要停用的密钥版本旁边的复选框。
点击标头中的停用。
在确认提示中,点击停用。
命令行
要在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Cloud SDK。
gcloud kms keys versions disable key-version \ --key key \ --keyring key-ring \ --location location
将 key-version 替换为要停用的密钥的版本。将 key 替换为密钥的名称。将 key-ring 替换为密钥所在的密钥环的名称。将 location 替换为密钥环的 Cloud KMS 位置。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
using Google.Cloud.Kms.V1;
using Google.Protobuf.WellKnownTypes;
public class DisableKeyVersionSample
{
public CryptoKeyVersion DisableKeyVersion(string projectId = "my-project", string locationId = "us-east1", string keyRingId = "my-key-ring", string keyId = "my-key", string keyVersionId = "123")
{
// Create the client.
KeyManagementServiceClient client = KeyManagementServiceClient.Create();
// Build the key version.
CryptoKeyVersion keyVersion = new CryptoKeyVersion
{
CryptoKeyVersionName = new CryptoKeyVersionName(projectId, locationId, keyRingId, keyId, keyVersionId),
State = CryptoKeyVersion.Types.CryptoKeyVersionState.Disabled,
};
// Build the update mask.
FieldMask fieldMask = new FieldMask
{
Paths = { "state" },
};
// Call the API.
CryptoKeyVersion result = client.UpdateCryptoKeyVersion(keyVersion, fieldMask);
// Return the result.
return result;
}
}
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
import (
"context"
"fmt"
"io"
kms "cloud.google.com/go/kms/apiv1"
kmspb "google.golang.org/genproto/googleapis/cloud/kms/v1"
fieldmask "google.golang.org/genproto/protobuf/field_mask"
)
// disableKeyVersion disables the specified key version on Cloud KMS.
func disableKeyVersion(w io.Writer, name string) error {
// parent := "projects/my-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key/cryptoKeyVersions/123"
// Create the client.
ctx := context.Background()
client, err := kms.NewKeyManagementClient(ctx)
if err != nil {
return fmt.Errorf("failed to create kms client: %v", err)
}
// Build the request.
req := &kmspb.UpdateCryptoKeyVersionRequest{
CryptoKeyVersion: &kmspb.CryptoKeyVersion{
Name: name,
State: kmspb.CryptoKeyVersion_DISABLED,
},
UpdateMask: &fieldmask.FieldMask{
Paths: []string{"state"},
},
}
// Call the API.
result, err := client.UpdateCryptoKeyVersion(ctx, req)
if err != nil {
return fmt.Errorf("failed to update key version: %v", err)
}
fmt.Fprintf(w, "Disabled key version: %s\n", result)
return nil
}
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
import com.google.cloud.kms.v1.CryptoKeyVersion;
import com.google.cloud.kms.v1.CryptoKeyVersion.CryptoKeyVersionState;
import com.google.cloud.kms.v1.CryptoKeyVersionName;
import com.google.cloud.kms.v1.KeyManagementServiceClient;
import com.google.protobuf.FieldMask;
import com.google.protobuf.util.FieldMaskUtil;
import java.io.IOException;
public class DisableKeyVersion {
public void disableKeyVersion() throws IOException {
// TODO(developer): Replace these variables before running the sample.
String projectId = "your-project-id";
String locationId = "us-east1";
String keyRingId = "my-key-ring";
String keyId = "my-key";
String keyVersionId = "123";
disableKeyVersion(projectId, locationId, keyRingId, keyId, keyVersionId);
}
// Disable a key version from use.
public void disableKeyVersion(
String projectId, String locationId, String keyRingId, String keyId, String keyVersionId)
throws IOException {
// Initialize client that will be used to send requests. This client only
// needs to be created once, and can be reused for multiple requests. After
// completing all of your requests, call the "close" method on the client to
// safely clean up any remaining background resources.
try (KeyManagementServiceClient client = KeyManagementServiceClient.create()) {
// Build the key version name from the project, location, key ring, key,
// and key version.
CryptoKeyVersionName keyVersionName =
CryptoKeyVersionName.of(projectId, locationId, keyRingId, keyId, keyVersionId);
// Build the updated key version, setting it to disbaled.
CryptoKeyVersion keyVersion =
CryptoKeyVersion.newBuilder()
.setName(keyVersionName.toString())
.setState(CryptoKeyVersionState.DISABLED)
.build();
// Create a field mask of updated values.
FieldMask fieldMask = FieldMaskUtil.fromString("state");
// Destroy the key version.
CryptoKeyVersion response = client.updateCryptoKeyVersion(keyVersion, fieldMask);
System.out.printf("Disabled key version: %s%n", response.getName());
}
}
}
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
//
// TODO(developer): Uncomment these variables before running the sample.
//
// const projectId = 'my-project';
// const locationId = 'us-east1';
// const keyRingId = 'my-key-ring';
// const keyId = 'my-key';
// const versionId = '123';
// Imports the Cloud KMS library
const {KeyManagementServiceClient} = require('@google-cloud/kms');
// Instantiates a client
const client = new KeyManagementServiceClient();
// Build the key version name
const versionName = client.cryptoKeyVersionPath(
projectId,
locationId,
keyRingId,
keyId,
versionId
);
async function disableKeyVersion() {
const [version] = await client.updateCryptoKeyVersion({
cryptoKeyVersion: {
name: versionName,
state: 'DISABLED',
},
updateMask: {
paths: ['state'],
},
});
console.log(`Disabled key version: ${version.name}`);
return version;
}
return disableKeyVersion();
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
use Google\Cloud\Kms\V1\CryptoKeyVersion;
use Google\Cloud\Kms\V1\CryptoKeyVersion\CryptoKeyVersionState;
use Google\Cloud\Kms\V1\KeyManagementServiceClient;
use Google\Protobuf\FieldMask;
function disable_key_version_sample(
string $projectId = 'my-project',
string $locationId = 'us-east1',
string $keyRingId = 'my-key-ring',
string $keyId = 'my-key',
string $versionId = '123'
) {
// Create the Cloud KMS client.
$client = new KeyManagementServiceClient();
// Build the key version name.
$keyVersionName = $client->cryptoKeyVersionName($projectId, $locationId, $keyRingId, $keyId, $versionId);
// Create the updated version.
$keyVersion = (new CryptoKeyVersion())
->setName($keyVersionName)
->setState(CryptoKeyVersionState::DISABLED);
// Create the field mask.
$updateMask = (new FieldMask())
->setPaths(['state']);
// Call the API.
$disabledVersion = $client->updateCryptoKeyVersion($keyVersion, $updateMask);
printf('Disabled key version: %s' . PHP_EOL, $disabledVersion->getName());
return $disabledVersion;
}
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
def disable_key_version(project_id, location_id, key_ring_id, key_id, version_id):
"""
Disable a key.
Args:
project_id (string): Google Cloud project ID (e.g. 'my-project').
location_id (string): Cloud KMS location (e.g. 'us-east1').
key_ring_id (string): ID of the Cloud KMS key ring (e.g. 'my-key-ring').
key_id (string): ID of the key to use (e.g. 'my-key').
version_id (string): ID of the key version to disable (e.g. '1').
Returns:
CryptoKeyVersion: The version.
"""
# Import the client library.
from google.cloud import kms
# Create the client.
client = kms.KeyManagementServiceClient()
# Build the key version name.
key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, version_id)
key_version = {
'name': key_version_name,
'state': kms.CryptoKeyVersion.CryptoKeyVersionState.DISABLED
}
# Build the update mask.
update_mask = {'paths': ['state']}
# Call the API.
disabled_version = client.update_crypto_key_version(request={'crypto_key_version': key_version, 'update_mask': update_mask})
print('Disabled key version: {}'.format(disabled_version.name))
return disabled_version
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
# TODO(developer): uncomment these values before running the sample.
# project_id = "my-project"
# location_id = "us-east1"
# key_ring_id = "my-key-ring"
# key_id = "my-key"
# version_id = "123"
# Require the library.
require "google/cloud/kms"
# Create the client.
client = Google::Cloud::Kms.key_management_service
# Build the key version name.
key_version_name = client.crypto_key_version_path project: project_id,
location: location_id,
key_ring: key_ring_id,
crypto_key: key_id,
crypto_key_version: version_id
# Create the updated version.
version = {
name: key_version_name,
state: :DISABLED
}
# Create the field mask.
update_mask = { paths: ["state"] }
# Call the API.
disabled_version = client.update_crypto_key_version crypto_key_version: version, update_mask: update_mask
puts "Disabled key version: #{disabled_version.name}"
安排销毁密钥版本
只有处于已启用或已停用状态的密钥版本可以安排进行销毁。您可以通过 DestroyCryptoKeyVersion
方法实现这一目的。
网页界面
转到 Cloud Console 中的加密密钥页面。
点击密钥环的名称,该密钥环包含您要安排销毁其密钥版本的密钥。
点击您要安排销毁其密钥版本的密钥。
选中要安排销毁的密钥版本旁边的复选框。
点击标头中的销毁。
在确认提示中输入密钥名称,然后点击安排销毁。
命令行
要在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Cloud SDK。
gcloud kms keys versions destroy key-version \ --key key \ --keyring key-ring \ --location location
将 key-version 替换为要销毁的密钥的版本。将 key 替换为密钥的名称。将 key-ring 替换为密钥所在的密钥环的名称。将 location 替换为密钥环的 Cloud KMS 位置。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
using Google.Cloud.Kms.V1;
public class DestroyKeyVersionSample
{
public CryptoKeyVersion DestroyKeyVersion(
string projectId = "my-project", string locationId = "us-east1", string keyRingId = "my-key-ring", string keyId = "my-key", string keyVersionId = "123")
{
// Create the client.
KeyManagementServiceClient client = KeyManagementServiceClient.Create();
// Build the key version name.
CryptoKeyVersionName keyVersionName = new CryptoKeyVersionName(projectId, locationId, keyRingId, keyId, keyVersionId);
// Call the API.
CryptoKeyVersion result = client.DestroyCryptoKeyVersion(keyVersionName);
// Return the result.
return result;
}
}
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
import (
"context"
"fmt"
"io"
kms "cloud.google.com/go/kms/apiv1"
kmspb "google.golang.org/genproto/googleapis/cloud/kms/v1"
)
// destroyKeyVersion marks a specified key version for deletion. The key can be
// restored if requested within 24 hours.
func destroyKeyVersion(w io.Writer, name string) error {
// parent := "projects/my-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key/cryptoKeyVersions/123"
// Create the client.
ctx := context.Background()
client, err := kms.NewKeyManagementClient(ctx)
if err != nil {
return fmt.Errorf("failed to create kms client: %v", err)
}
// Build the request.
req := &kmspb.DestroyCryptoKeyVersionRequest{
Name: name,
}
// Call the API.
result, err := client.DestroyCryptoKeyVersion(ctx, req)
if err != nil {
return fmt.Errorf("failed to destroy key version: %v", err)
}
fmt.Fprintf(w, "Destroyed key version: %s\n", result)
return nil
}
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
import com.google.cloud.kms.v1.CryptoKeyVersion;
import com.google.cloud.kms.v1.CryptoKeyVersionName;
import com.google.cloud.kms.v1.KeyManagementServiceClient;
import java.io.IOException;
public class DestroyKeyVersion {
public void destroyKeyVersion() throws IOException {
// TODO(developer): Replace these variables before running the sample.
String projectId = "your-project-id";
String locationId = "us-east1";
String keyRingId = "my-key-ring";
String keyId = "my-key";
String keyVersionId = "123";
destroyKeyVersion(projectId, locationId, keyRingId, keyId, keyVersionId);
}
// Schedule destruction of the given key version.
public void destroyKeyVersion(
String projectId, String locationId, String keyRingId, String keyId, String keyVersionId)
throws IOException {
// Initialize client that will be used to send requests. This client only
// needs to be created once, and can be reused for multiple requests. After
// completing all of your requests, call the "close" method on the client to
// safely clean up any remaining background resources.
try (KeyManagementServiceClient client = KeyManagementServiceClient.create()) {
// Build the key version name from the project, location, key ring, key,
// and key version.
CryptoKeyVersionName keyVersionName =
CryptoKeyVersionName.of(projectId, locationId, keyRingId, keyId, keyVersionId);
// Destroy the key version.
CryptoKeyVersion response = client.destroyCryptoKeyVersion(keyVersionName);
System.out.printf("Destroyed key version: %s%n", response.getName());
}
}
}
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
//
// TODO(developer): Uncomment these variables before running the sample.
//
// const projectId = 'my-project';
// const locationId = 'us-east1';
// const keyRingId = 'my-key-ring';
// const keyId = 'my-key';
// const versionId = '123';
// Imports the Cloud KMS library
const {KeyManagementServiceClient} = require('@google-cloud/kms');
// Instantiates a client
const client = new KeyManagementServiceClient();
// Build the key version name
const versionName = client.cryptoKeyVersionPath(
projectId,
locationId,
keyRingId,
keyId,
versionId
);
async function destroyKeyVersion() {
const [version] = await client.destroyCryptoKeyVersion({
name: versionName,
});
console.log(`Destroyed key version: ${version.name}`);
return version;
}
return destroyKeyVersion();
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
use Google\Cloud\Kms\V1\KeyManagementServiceClient;
function destroy_key_version_sample(
string $projectId = 'my-project',
string $locationId = 'us-east1',
string $keyRingId = 'my-key-ring',
string $keyId = 'my-key',
string $versionId = '123'
) {
// Create the Cloud KMS client.
$client = new KeyManagementServiceClient();
// Build the key version name.
$keyVersionName = $client->cryptoKeyVersionName($projectId, $locationId, $keyRingId, $keyId, $versionId);
// Call the API.
$destroyedVersion = $client->destroyCryptoKeyVersion($keyVersionName);
printf('Destroyed key version: %s' . PHP_EOL, $destroyedVersion->getName());
return $destroyedVersion;
}
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
def destroy_key_version(project_id, location_id, key_ring_id, key_id, version_id):
"""
Schedule destruction of the given key version.
Args:
project_id (string): Google Cloud project ID (e.g. 'my-project').
location_id (string): Cloud KMS location (e.g. 'us-east1').
key_ring_id (string): ID of the Cloud KMS key ring (e.g. 'my-key-ring').
key_id (string): ID of the key to use (e.g. 'my-key').
version_id (string): ID of the key version to destroy (e.g. '1').
Returns:
CryptoKeyVersion: The version.
"""
# Import the client library.
from google.cloud import kms
# Create the client.
client = kms.KeyManagementServiceClient()
# Build the key version name.
key_version_name = client.crypto_key_version_path(project_id, location_id, key_ring_id, key_id, version_id)
# Call the API.
destroyed_version = client.destroy_crypto_key_version(request={'name': key_version_name})
print('Destroyed key version: {}'.format(destroyed_version.name))
return destroyed_version
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
# TODO(developer): uncomment these values before running the sample.
# project_id = "my-project"
# location_id = "us-east1"
# key_ring_id = "my-key-ring"
# key_id = "my-key"
# version_id = "123"
# Require the library.
require "google/cloud/kms"
# Create the client.
client = Google::Cloud::Kms.key_management_service
# Build the key version name.
key_version_name = client.crypto_key_version_path project: project_id,
location: location_id,
key_ring: key_ring_id,
crypto_key: key_id,
crypto_key_version: version_id
# Call the API.
destroyed_version = client.destroy_crypto_key_version name: key_version_name
puts "Destroyed key version: #{destroyed_version.name}"