Google Cloud KMS解密问题

时间:2019-03-10 16:37:24

标签: google-cloud-kms

我是Cloud KMS的新手,我开始完全按照here

的描述进行操作

我通过运行此命令加密了以UTF-8格式保存的数据文件

gcloud kms encrypt --location global --keyring ring --key key --plaintext-file /path_to_file --ciphertext-file /path_to_enc --project myProject 

因此,我的加密数据已以这种格式显示在我新创建的加密文件中

$�]ˋLݿ���yHI�lS�`&�Nt�b{%�U��   �&�A���XaL��d

这是我读取加密文件数据的方式:

 static Properties properties = new Properties();

static {

    try {

        InputStream in = new Credentials().getClass().getResourceAsStream("path_to_enc_file");
        byte[] encryptedData = IOUtils.toByteArray(in);

        byte[] decryptedBytes = decrypt(EnvironmentVariable.getProjectId(), "global", "ring", "key", encryptedData);
        ByteArrayInputStream bis = new ByteArrayInputStream(decryptedBytes);

        properties.load(bis);           
        in.close();
        bis.close();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

,现在每当我尝试通过此功能对其解密时:

public static byte[] decrypt(
    String projectId, String locationId, String keyRingId, String cryptoKeyId, byte[] ciphertext)
    throws IOException {

  // Create the KeyManagementServiceClient using try-with-resources to manage client cleanup.
  try (KeyManagementServiceClient client = KeyManagementServiceClient.create()) {

    // The resource name of the cryptoKey
    String resourceName = CryptoKeyName.format(projectId, locationId, keyRingId, cryptoKeyId);

    // Decrypt the ciphertext with Cloud KMS.
    DecryptResponse response = client.decrypt(resourceName, ByteString.copyFrom(ciphertext));

    // Extract the plaintext from the response.
    return response.getPlaintext().toByteArray();
  }
}

它扔了

{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Decryption failed: the ciphertext is invalid.",
    "reason" : "badRequest"
  } ],
  "message" : "Decryption failed: the ciphertext is invalid.",
  "status" : "INVALID_ARGUMENT"
}

密钥类型为:Symmetric encrypt/decrypt默认算法:Google symmetric key

响铃位置:global

您能帮助我,告诉我Google文档中缺少什么吗?

3 个答案:

答案 0 :(得分:2)

更新:正如bdhess在评论中所说,这可能是由于Maven在构建过程中“有帮助”并破坏了数据。有关如何避免这种情况的信息,请参见Maven docs

下面的解决方案也可以,但是不太直接。


Tamer和我聊天了一段时间,并找到了解决方法:

  • 在将gcloud的输出包含在src/main/resources中的文件中之前,先在base64中对其进行编码。
  • java.util.Base64读取文件后对其进行解码。
  • 将解码后的字节传递到KMS API。

由于某些原因,在使用gcloud创建文件和使用getResourceAsStream()读取字节之间,字节已损坏。从上面的代码中,我看不到损坏将在哪里发生,并且似乎应该完全支持读二进制资源。但是,在Tamer案中,某些地方发生了问题。

我将在本周的某个时间尝试重制它。

答案 1 :(得分:0)

我进行了这些修改,然后在@hjfreyer的大力帮助下,它像一种魅力一样工作了

1-加密我这样做的纯文本秘密

  • 运行此命令->

    gcloud kms加密-全局位置-纯文本文件PATH_TO_SECRET_FILE-密文文件PATH_TO_TMP_FILE --project myProject --key key --keyring ring

  • 将结果编码为base64->

    base64 PATH_TO_TMP_FILE> PATH_TO_FINAL_ENC_FILE

  • 从FINAL_ENC_FILE文件中删除新行

2-首先解密数据,我需要对base64进行解码,然后将其传递给解密KMS函数

InputStream in = new Credentials().getClass().getResourceAsStream("PATH_TO_FINAL_ENC_FILE");
            byte[] encryptedData = IOUtils.toByteArray(in);


            byte[] decryptedBytes = decrypt(EnvironmentVariable.getProjectId(), "global", "ring", "key", Base64.getDecoder().decode(encryptedData));

答案 2 :(得分:0)

要将文件中的机密解密为纯文本文件,

cat secret.enc | gcloud kms decrypt \
  --location=global \
  --keyring=keyring \
  --key=key \
  --ciphertext-file=- \
  --plaintext-file=decrypted_secret.txt