如何从Google Cloud Storage解密文件?

时间:2019-07-29 09:18:25

标签: encryption google-cloud-storage google-cloud-kms

我有一个加密的文件存储在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

1 个答案:

答案 0 :(得分:1)

我在这里发现了一些东西:

  1. 假设您的命令正确,则my-file-enc应该改为my-file.enc(点对点)

  2. 验证projectId的设置正确。如果要通过环境变量填充它,请console.log并确保它与您创建KMS密钥的项目匹配。 gcloud默认为项目(您可以通过运行gcloud config list并检查core/project属性来确定哪个项目)。如果您在项目foo中创建了密钥,但是您的Cloud Run服务正在项目bar中进行查找,它将失败。

  3. 使用--ciphertext-file写入文件时,数据不是 base64编码的。但是,您正在创建一个二进制文件。您如何将该二进制字符串上传到Cloud Storage?罪魁祸首似乎是编码问题(ASCII与UTF),可能导致解密失败。确保您正在以二进制格式写入和读取文件。

  4. 查看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});
    
  5. 您可能想看一下Berglas,它可以自动完成此过程。 Cloud Run with node确实有很好的例子。

  6. 有关更多模式,请查看Secrets in Serverless