本页面讨论了客户提供的加密密钥。如需了解其他加密选项,请参阅数据加密选项。
概览
作为 Google 管理的加密密钥之上的附加层,您可以选择提供自己的 AES-256 密钥(采用标准 Base64 编码)。此密钥被称为客户提供的加密密钥。如果您提供客户提供的加密密钥,则 Cloud Storage 不会将您的密钥永久存储在 Google 服务器上或以其他方式管理您的密钥。您将为每个 Cloud Storage 操作提供密钥,操作完成后,系统将从 Google 服务器中完全清除您的密钥。Cloud Storage 仅存储密钥的加密哈希值,以便根据哈希值验证未来的请求。您的密钥将无法从此哈希值中恢复,并且此哈希值无法用于解密您的数据。
何时使用密钥?
将客户提供的加密密钥应用到对象上时,Cloud Storage 会在加密以下信息时使用该密钥:
- 对象的数据。
- 对象的 CRC32C 校验和。
- 对象的 MD5 哈希值。
Cloud Storage 使用标准服务器端密钥加密对象的其余元数据,包括对象的名称。这样您可以读取和更新常规元数据以及列出和删除对象,无需使用客户提供的加密密钥。但是,要执行以上任一操作,您必须具有足够的权限。
例如,如果对象是使用客户提供的加密密钥进行加密的,您必须使用该密钥才能在该对象上执行操作,例如下载或移动对象。如果您尝试在不提供密钥的情况下读取对象的元数据,您会收到对象名称和 Content-Type
之类的元数据,但不会收到对象的 CRC32C 校验和或 MD5 哈希值。如果在针对对象元数据的请求中提供了密钥,则除了收到元数据以外,您还将收到对象的 CRC32C 校验和以及 MD5 哈希值。
HTTPS 检查
如需在读取和写入操作期间保护通过互联网传输的数据,请使用传输层安全协议(通常称为 TLS 或 HTTPS)。提供加密密钥时需要 TLS。如果您意外地通过未加密的 (HTTP) 连接使用加密密钥,攻击者可能会拦截您的密钥。由于存在这种可能性,Cloud Storage API 会返回一条错误消息,警告您密钥可能已泄露。如果发生这种情况,您应立即轮替密钥
限制
使用客户提供的加密密钥时,存在以下限制:
Cloud Storage Transfer Service 和 Cloud Dataflow 目前不支持使用客户提供的加密密钥加密的对象。
您无法使用 Google Cloud Console 下载使用客户提供的加密密钥加密的对象。同样,如果您使用 Google Cloud Console 上传对象,则无法使用客户提供的加密密钥加密对象。但是,您可以使用客户管理的加密密钥执行这些操作。
要结合使用客户提供的加密密钥与 gsutil,您必须具有 gsutil 4.18 或更高版本。
您只能在单个对象上设置客户提供的加密密钥。 您无法为存储分区设置默认的客户提供的加密密钥。
如果对象通过客户提供的加密密钥进行加密,并且您要对此对象执行
compose
操作,则必须使用相同的密钥对组件对象进行加密,并且您需要随同组合请求一起提供该密钥。生成的复合对象将使用相同的密钥进行加密。
帮助您使用加密密钥的工具
您可以通过多种方式来结合使用客户提供的加密密钥与 Cloud Storage。这些方式包括:
- 合作伙伴公司。
- JSON 和 XML REST API。
- gsutil 命令行工具。
通过合作伙伴公司使用加密密钥
您可以通过多种第三方合作伙伴方案来使用客户提供的加密密钥。这些合作伙伴可以帮助您更轻松地生成加密密钥并将该密钥与 Cloud Storage 中的对象进行关联。可以为 Cloud Storage 提供密钥的合作伙伴包括 Ionic Security 和 KeyNexus。
要了解详情,请参阅“Cloud Storage 合作伙伴”页面。
通过 REST API 使用加密密钥
当您使用客户提供的加密密钥并直接使用 JSON 或 XML API 时,您必须同时提供 AES-256 密钥和该密钥的 SHA256 哈希值。您应安全存储 AES-256 密钥和密钥的 SHA256 哈希值。Google 将密钥的 SHA256 哈希值存储在对象的元数据中,以便您未来进行检索。Google(或其他任何人)无法使用此 SHA256 哈希值来解密您的数据。之所以存储此哈希值,目的是为了唯一标识用于加密特定对象的 AES-256 密钥。
请求标头
在 JSON 或 XML 请求中包含以下 HTTP 标头:
标头名称 | 值 | 说明 |
---|---|---|
x-goog-encryption-algorithm |
字符串 | 要使用的加密算法。您必须使用值 AES256 。 |
x-goog-encryption-key |
字符串 | AES-256 加密密钥的 RFC 4648 Base64 编码字符串。 |
x-goog-encryption-key-sha256 |
字符串 | 加密密钥的 SHA256 哈希值的 RFC 4648 Base64 编码字符串。 |
如果您使用 JSON API 执行重写操作,则使用上面列出的标头加密目标对象,并使用以下标头解密源对象:
标头名称 | 值 | 说明 |
---|---|---|
x-goog-copy-source-encryption-algorithm |
字符串 | 要使用的加密算法。您必须使用值 AES256 。 |
x-goog-copy-source-encryption-key |
字符串 | 源对象的 AES-256 加密密钥的 RFC 4648 Base64 编码字符串。 |
x-goog-copy-source-encryption-key-sha256 |
字符串 | 源对象的加密密钥的 SHA256 哈希值的 RFC 4648 Base64 编码字符串。 |
响应
JSON
使用 JSON API 时,响应正文将返回客户提供的加密密钥的元数据,其中包括以下属性:
属性名称 | 值 | 说明 |
---|---|---|
customerEncryption |
对象 | 用于请求的加密的相关信息。 |
customerEncryption.encryptionAlgorithm |
字符串 | 使用的加密算法。始终包含值 AES256 。 |
customerEncryption.keySha256 |
字符串 | 加密密钥的 SHA256 哈希值的 RFC 4648 Base64 编码字符串。您可以使用此 SHA256 哈希值来唯一标识解密对象所需的 AES-256 加密密钥(您必须安全存储该密钥)。 |
XML
使用 XML API 时,响应中包含以下标头:
标头名称 | 值 | 说明 |
---|---|---|
x-goog-encryption-algorithm |
字符串 | 使用的加密算法。始终包含值 AES256 。 |
x-goog-encryption-key-sha256 |
字符串 | 加密密钥的 SHA256 哈希值的 RFC 4648 Base64 编码字符串。您可以使用此 SHA256 哈希值来唯一标识解密对象所需的 AES-256 加密密钥(您必须安全存储该密钥)。 |
在以下情况下,您收到 HTTP 400 错误:
- 您使用客户提供的加密密钥上传对象,并尝试在不提供密钥的情况下对对象执行其他操作(用于请求或更新大多数元数据或删除对象的操作除外)。
- 您使用客户提供的加密密钥上传对象,并尝试使用错误的密钥对对象执行其他操作。
- 您在不提供客户提供的加密密钥的情况下上传对象,并尝试使用客户提供的加密密钥对该对象执行其他操作。
- 您指定了无效的加密算法、密钥或 SHA256 哈希值。
通过 gsutil 使用加密密钥
要通过 gsutil 使用客户提供的加密密钥,请将以下选项添加到 boto 配置文件的 [GSUtil]
部分:
选项名称 | 值 | 说明 |
---|---|---|
encryption_key |
字符串 | AES-256 加密密钥的 RFC 4648 Base64 编码字符串。 |
您可以选择指定一个或多个解密密钥。gsutil 将 encryption_key
选项同时用作加密和解密密钥,而您指定的任何 decryption_key
选项仅用于解密对象。有关详情,请参阅 gsutil 文档。
只要您的 boto 配置文件中包含加密或解密密钥,它们就会被用于所有 gsutil 命令。解密时,gsutil 会计算提供的加密和解密密钥的 SHA256 哈希值,并通过匹配对象元数据中的 SHA256 哈希值来选择用于特定对象的正确密钥。
如果您使用客户提供的加密密钥上传对象,并尝试在不提供密钥的情况下对对象执行其他操作(用于请求或更新元数据或删除对象的操作除外),您会收到一则错误。
加密密钥轮替
如果对象是使用客户提供的加密密钥进行加密的,您可以通过重写对象来轮替对象的密钥。JSON API 支持重写操作,XML API 不支持。要查看密钥轮替的示例,请参阅轮替加密密钥。
后续步骤
- 了解如何使用客户提供的加密密钥。