状况:
我正在尝试从我的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), "
}
]
}
]
}
}
答案 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>