"' ciphertext'中的值无效(TYPE_BYTES)"

时间:2018-01-31 15:35:21

标签: javascript node.js encryption google-cloud-platform google-cloud-kms

状况:

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

对于加密和解密,我使用:

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

可悲的是,我收到了一个错误:"' ciphertext'中的值无效(TYPE_BYTES)"

我知道密文是正确的,我相信这可能是Google KMS API所期望的数据类型的一个问题,即:在检索加密数据时,我的代码在发送之前以某种方式更改了它的类型对Google KMS API的POST请求。

我做错了什么以及如何解决?

CODE:

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), "
          }
        ]
      }
    ]
  }
}

1 个答案:

答案 0 :(得分:4)

我认为你可能没有传递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帐户登录,我已授予该密钥的加密权限):

{
  "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编码作为传输要求的一部分来处理。所以希望你可以使用这个已知良好的密文和一个密钥,你可以解密它来调试你自己的代码。祝你好运!

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