本页面介绍如何在 Cloud SQL 上执行客户端加密功能。
概览
客户端加密功能是在将数据写入 Cloud SQL 之前加密数据的行为。您可以以只有应用能解密的方式加密 Cloud SQL 数据。
如需启用客户端加密功能,您有以下选择:
- 使用存储在 Cloud Key Management Service (Cloud KMS) 中的加密密钥。
- 使用在应用中本地存储的加密密钥。
在本主题中,我们将介绍如何使用第一个选项,这种方式提供最无缝的密钥管理选项。我们在 Cloud KMS 中创建加密键,并使用 Google 的开源加密库 Tink 实现信封加密。
为什么需要客户端加密?
如果您要保护列级别 1 中的 Cloud SQL 数据,则需要客户端加密。假设您有一个包含姓名和信用卡号的表。您希望授予用户对该表的访问权限,但又不希望他们查看信用卡号。您可以使用客户端加密来加密卡号。只要用户未被授予对 Cloud KMS 中加密密钥的访问权限,其便无法读取信用卡信息。
使用 Cloud KMS 创建密钥
借助 Cloud KMS,您可以在 Google Cloud Platform 上创建和管理密钥。
Cloud KMS 支持许多不同的密钥类型。对于客户端加密,您需要创建对称密钥。
如需向您的应用授予对 Cloud KMS 中键的访问权限,您需要向应用使用的服务账号授予 cloudkms.cryptoKeyEncrypterDecrypter
角色。在 gcloud 中,您可以使用以下命令执行此操作:
gcloud kms keys add-iam-policy-binding key \ --keyring=key-ring \ --location=location \ --member=serviceAccount:service-account-name@example.domain.com \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
虽然您可以使用 KMS 密钥直接加密数据,但我们在此处使用更为灵活的解决方案—信封加密。借助此方案,我们就可以加密长度超过 64KB 的消息,这是 Cloud Key Management Service API 可以支持的最大消息大小。
Cloud KMS 信封加密
在信封加密中,KMS 密钥充当密钥加密密钥 (KEK)。也就是说,该加密密钥可用于加密数据加密密钥 (DEK),而 DEK 则可用于加密实际数据。
在 Cloud KMS 中创建 KEK 之后,如要对每条消息进行加密,您需要执行以下操作:
- 在本地生成数据加密密钥 (DEK)。
- 在本地使用此 DEK 对消息进行加密。
- 调用 Cloud KMS 使用 KEK 加密(封装)DEK。
- 存储加密后的数据和封装后的 DEK。
在本主题中,我们使用 Tink,而不是从头开始实施信封加密。
Tink
Tink 是一个多语言的跨平台库,提供高级加密 API。如需使用 Tink 的信封加密对数据进行加密,请为 Tink 提供一个指向 Cloud KMS 中的 KEK 的密钥 URI,并提供允许 Tink 使用 KEK 的凭据。Tink 生成 DEK、加密数据、封装 DEK,然后返回包含加密数据和封装 DEK 的单个密文。
Tink 支持在 C++、Java、Go 和 Python 中使用 AEAD API 进行信封加密:
public interface Aead{
byte[] encrypt(final byte[] plaintext, final byte[] associatedData)
throws…
byte[] decrypt(final byte[] ciphertext, final byte[] associatedData)
throws…
}
除了普通的消息/密文参数,加密和解密方法还支持可选关联的数据。此参数可用于将密文与部分数据关联。例如,假设您有一个包含字段 user-id
和字段 encrypted-medical-history
的数据库。在这种情况下,在加密医疗记录时,字段 user-id
可能会用作关联数据。这样可确保攻击者无法将一个用户的医疗记录转移到另一个用户。它还用于在运行查询时验证数据行是否正确。
示例
在本部分中,我们将详细介绍使用客户端加密的选票信息数据库的示例代码。该示例代码演示了如何执行以下操作:
- 创建数据库表和连接池
- 设置 Tink 以进行信封加密
- 使用 Tink 的信封加密和 Cloud KMS 中的 KEK 加密和解密数据
准备工作
按照以下这些说明创建 Cloud SQL 实例。请记下您创建的连接字符串、数据库用户和数据库密码。
按照这些说明为您的应用创建数据库。 记下数据库名称。
按照这些说明为您的应用创建 KMS 密钥。复制已创建键的资源名称。
按照这些说明创建具有“Cloud SQL Client”权限的服务账号。
按照这些说明,将该键的“Cloud KMS CryptoKey Encrypter/Decrypter”权限添加到您的服务账号。