客户提供的加密密钥

本页面讨论了客户提供的加密密钥。如需了解其他加密选项,请参阅数据加密选项。如需了解使用此功能的示例,请参阅使用客户提供的加密密钥

概览

作为 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 传输服务Cloud DataflowCloud Dataproc 目前不支持使用客户提供的加密密钥加密的对象。

  • 您无法使用 Google Cloud Platform Console 下载使用客户提供的加密密钥加密的对象。同样地,当您使用 Google Cloud Platform Console 上传对象时,您无法使用客户提供的加密密钥加密对象。但是,您可以使用客户管理的加密密钥执行这些操作。

  • 客户提供的加密密钥可在以下国家/地区使用:

    阿根廷、奥地利、澳大利亚、比利时、保加利亚、加拿大、智利、哥伦比亚、塞浦路斯、捷克共和国、丹麦、爱沙尼亚、芬兰、法国、德国、希腊、中国香港、匈牙利、印度尼西亚、爱尔兰、以色列、意大利、日本、立陶宛、卢森堡、拉脱维亚、马来西亚、马耳他、墨西哥、荷兰、新西兰、挪威、秘鲁、波兰、葡萄牙、罗马尼亚、新加坡、斯洛伐克、南非、韩国、西班牙、瑞典、瑞士、中国台湾、泰国、土耳其、英国、美国、越南

    如果您所在的国家/地区不在此列表中,您可以申请添加您的国家/地区

  • 要结合使用客户提供的加密密钥与 gsutil,您必须具有 gsutil 4.18 或更高版本

  • 您只能在单个对象上设置客户提供的加密密钥。您无法为存储分区设置默认的客户提供的加密密钥。

  • 如果对象通过客户提供的加密密钥进行加密,并且您要对此对象执行 compose 操作,则必须使用相同的密钥对组件对象进行加密,并且您需要随同组合请求一起提供该密钥。生成的复合对象将使用相同的密钥进行加密。

帮助您使用加密密钥的工具

您可以通过多种方式来结合使用客户提供的加密密钥与 Cloud Storage。这些方式包括:

  • 合作伙伴公司。
  • JSON 和 XML REST API。
  • gsutil 命令行工具。

通过合作伙伴公司使用加密密钥

您可以通过多种第三方合作伙伴方案来使用客户提供的加密密钥。这些合作伙伴可以帮助您更轻松地生成加密密钥并将该密钥与 Cloud Storage 中的对象进行关联。可以为 Cloud Storage 提供密钥的合作伙伴包括 Ionic Security 和 KeyNexus。

要了解详情,请参阅“Cloud Storage 合作伙伴”页面

通过 REST API 使用加密密钥

当您使用客户提供的加密密钥并直接使用 JSONXML 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 不支持。要查看密钥轮替的示例,请参阅轮替加密密钥

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud Storage
需要帮助?请访问我们的支持页面