"Invalid value at 'ciphertext' (TYPE_BYTES)"

"Invalid value at 'ciphertext' (TYPE_BYTES)"

情况:

我正在尝试从我的 google 云存储桶中下载和解密一些数据。

加解密我用的是:

https://cloud.google.com/kms/docs/quickstart#decrypt_data

遗憾的是,我收到一个错误:"Invalid value at 'ciphertext' (TYPE_BYTES)"。

我知道密文是正确的,我相信这可能是 Google KMS API 预期的数据类型的问题,即:当检索加密数据时,我的代码不知何故在将 POST 请求发送到 Google KMS API.

之前更改了它的类型

我做错了什么,我该如何解决?


代码:

gcs.bucket(bucketName)
.file('mysecret.txt.encrypted.txt')
.download({ destination: 'mysecret.txt.encrypted.txt' })
.then(() => {
    fs.readFile('mysecret.txt.encrypted.txt', (err, data) => {
        if (err) throw err;
        console.log("DATA: "+data);
        var formData = {
           ciphertext: data, 
        };
        request.post({
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer ...'
            },
            url: 'https://cloudkms.googleapis.com/v1/projects/kms-raimarketplace/locations/global/keyRings/.../cryptoKeys/...:decrypt',
            form: formData
        },
        function (err, httpResponse, body) {
            if (err) {
                console.log("ERROR: "+err);
            }
            else {
                console.log("BODY: "+body);
            }
            console.log(err, body);
        });
    });
}).catch(e => {
    console.error('getEnv.js: There was an error: ${JSON.stringify(e, undefined, 2)}');
});

输出:

BODY: {
  "error": {
    "code": 400,
    "message": "Invalid value at 'ciphertext' (TYPE_BYTES), ",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "ciphertext",
            "description": "Invalid value at 'ciphertext' (TYPE_BYTES), "
          }
        ]
      }
    ]
  }
}

我认为你传递的可能不是base64编码的密文;这是此类解码失败时返回的错误(尽管在其他情况下也可能出现此消息)。

我创建了一个世界通用的密钥,任何人都可以用它来解密,你应该可以用它来测试。

这是我用来创建密文的代码。 (您将无法 运行 这段代码,因为我没有打开密钥的加密权限。这段代码是直接从 Cloud KMS Quickstart 中插入我的密钥和内联 base64 编码)

curl -s -X POST "https://cloudkms.googleapis.com/v1/projects/cloud-kms-demonstration/locations/global/keyRings/insecure-example-key-ring/cryptoKeys/insecure-example-key:encrypt" \
-d "{\"plaintext\":\"$(echo hello world | base64)\"}" \
  -H "Authorization:Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type:application/json"

当我 运行 这个时,我得到以下输出(我 运行 它在 GCP Cloud Shell 中以我的 gmail 帐户登录,我 g运行ted 对密钥的加密权限):

{
  "name": "projects/cloud-kms-demonstration/locations/global/keyRings/insecure-example-key-ring/cryptoKeys/insecure-example-key/cryptoKeyVersions/1",
  "ciphertext": "CiQAOay+bYR0HXjYHihHZmjPnu0ZEdOm4/HW4S6ZBifwWfFnL1QSNQBA6mRpHiq1MPQ7MerLyJ+gFJdeQooBFU0K0YmGlxRy5Ke/2eV16yR0viHPII6flFpzxnmD"
}

那么我运行下面的命令;您会看到我从加密操作的输出中复制并粘贴了密文。任何通过身份验证的人都可以运行此命令使用我的密钥解密密文,所以现在请随时运行它:

curl -s -X POST "https://cloudkms.googleapis.com/v1/projects/cloud-kms-demonstration/locations/global/keyRings/insecure-example-key-ring/cryptoKeys/insecure-example-key:decrypt" \
  -d "{\"ciphertext\":\"CiQAOay+bYR0HXjYHihHZmjPnu0ZEdOm4/HW4S6ZBifwWfFnL1QSNQBA6mRpHiq1MPQ7MerLyJ+gFJdeQooBFU0K0YmGlxRy5Ke/2eV16yR0viHPII6flFpzxnmD\"}" \
  -H "Authorization:Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type:application/json"

我得到了结果:

{
  "plaintext": "aGVsbG8gd29ybGQK"
}

我的明文的base64编码是哪个:

$ echo "aGVsbG8gd29ybGQK" | base64 -d
hello world

如果我使用的是库,它可能会处理 base64 编码作为 t运行运动要求的一部分。因此,希望您可以使用这个已知良好的密文和一个可以解密它的密钥来调试您自己的代码。祝你好运!

注意:如名称所示,不要使用我提供的密钥来确保任何安全(这就是为什么我没有打开密钥的加密权限)。