数据完整性保证

本页介绍了如何在添加访问 Secret 版本时使用校验和来维护和验证 Secret 数据的完整性。

您可以将校验和视为数据的唯一指纹。它是使用 CRC32C 算法从密钥数据生成的简短代码。如果您的密钥数据中哪怕只有一位发生变化,校验和也会随之变化。这样一来,Secret Manager 就能检测到任何意外修改或损坏。

Secret Manager 通过以下方式使用校验和:

  1. 添加密文版本时:

    • Secret Manager 会计算密文数据的 CRC32C 校验和。

    • 此校验和与 Secret 数据一起存储。

  2. 访问密文版本时:

    • Secret Manager 会返回密文数据及其校验和。

    • 您可以使用此校验和来验证收到的数据是否与存储在 Secret Manager 中的数据完全相同。

为确保校验和与 SecretPayload 结构兼容,必须使用 CRC32C 算法计算秘密数据的校验和,并将其编码为十进制整数。SecretVersion 响应包含一个字段,用于指示服务器是否已成功接收并验证此校验和。

以下示例展示了校验和在 Secret Manager 中的运作方式:

API

这些示例使用 curl 来使用 API 演示。 您可以使用 gcloud auth print-access-token 生成访问令牌。在 Compute Engine 或 GKE 上,您必须使用 cloud-platform 范围进行身份验证

对于存储在数据文件中的 Secret 数据,使用 gcloud storage hash 计算校验和。 校验和必须转换为十进制格式;它在 SecretPayload proto 中编码为 int64。

$ gcloud storage hash "/path/to/file.txt" --hex

如果通过命令行传递了 Secret 数据,请按如下方式计算校验和:

$ gcloud storage hash --hex cat <(echo ${SECRET_DATA})

对密文数据进行 Base64 编码并将其另存为 shell 变量。

$ SECRET_DATA=$(echo "seCr3t" | base64)

使用 curl 调用 API。

$ curl "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/secret-id:addVersion" \
    --request "POST" \
    --header "authorization: Bearer $(gcloud auth print-access-token)" \
    --header "content-type: application/json" \
    --data "{\"payload\": {\"data\": \"${SECRET_DATA}\", \"data_crc32c\": $CHECKSUM}}"

当访问密文版本时,返回的 SecretPayload 包含数据及其校验和。以下是示例回答:

{
  "name": "projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION_ID",
  "payload": {
    "data": "YQo=",
    "dataCrc32c": "163439259"
  }
}

在控制台中,当您添加密文版本时,系统会在您输入密文值时自动计算校验和。

使用客户管理的加密密钥 (CMEK) 加密且在 2021 年 7 月 16 日之前创建的 Secret 版本未存储校验和。

后续步骤