我有一个加密的文件存储在Google Cloud Storage存储桶中,该文件是通过以下命令行生成的:
Dim i As Long, c As Word.Cell, doc As Document
Set doc = ActiveDocument
For i = 1 To doc.Tables.Count
If i = 3 Or i = 4 Or i = 8 Or i = 9 Then
For Each c In doc.Tables(i).Range.Cells
' your code here
Next
End If
Next
我现在正在尝试使用以下代码在Cloud Run服务中解密此类文件:
gcloud kms encrypt --location=global --keyring=my-keyring --key=-my-key --plaintext-file=my-file --ciphertext-file=my-file.enc
我收到以下错误:
const kms = require('@google-cloud/kms');
const client = new kms.KeyManagementServiceClient();
const file = storage.bucket("my-bucket").file('my-file.enc');
const name = client.cryptoKeyPath( 'projectId', 'global', 'my-keyring', 'my-key' );
let encrypted = (await file.download())[0];
const [result] = await client.decrypt({name, encrypted });
根据this,其中哪一项具有误导性,应视为未正确解密。我无法撼动自己缺少某处的base64编码/解码的感觉,但似乎找不到解决方法。
如果我从命令行运行解密,则效果很好。
非常感谢您的帮助。
谢谢。
编辑: 这个很棒的社区解决了问题。如果其他人面临相同的问题,请按照以下步骤进行操作:
使用以下命令行对文件进行加密,然后通过网络界面上传。
Error: Decryption failed: verify that 'name' refers to the correct CryptoKey.
使用以下代码解密:
gcloud kms encrypt --location=global --keyring=my-keyring --key=-my-key --plaintext-file=my-file --ciphertext-file=my-file.enc
答案 0 :(得分:1)
我在这里发现了一些东西:
假设您的命令正确,则my-file-enc
应该改为my-file.enc
(点对点)
验证projectId
的设置正确。如果要通过环境变量填充它,请console.log
并确保它与您创建KMS密钥的项目匹配。 gcloud默认为项目(您可以通过运行gcloud config list
并检查core/project
属性来确定哪个项目)。如果您在项目foo
中创建了密钥,但是您的Cloud Run服务正在项目bar
中进行查找,它将失败。
使用--ciphertext-file
写入文件时,数据不是 base64编码的。但是,您正在创建一个二进制文件。您如何将该二进制字符串上传到Cloud Storage?罪魁祸首似乎是编码问题(ASCII与UTF),可能导致解密失败。确保您正在以二进制格式写入和读取文件。
查看Cloud KMS Nodejs文档,它指定密文应该“与从加密调用返回的完全相同”。该文档说KMS响应是base64 encoded string,因此您可以在将数据发送到Cloud KMS进行解密之前,尝试在Cloud Run服务 中对数据进行base64编码:
let encrypted = (await file.download())[0];
let encryptedEncoded = encrypted.toString('base64');
const [result] = await client.decrypt({name, encrypted});
您可能想看一下Berglas,它可以自动完成此过程。 Cloud Run with node确实有很好的例子。
有关更多模式,请查看Secrets in Serverless。