0

我是 Cloud KMS 的新手,我开始完全按照此处所写的内容进行操作

我通过运行此命令加密了以 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

你能帮我看看谷歌文档中缺少什么吗?

4

3 回答 3

2

更新:正如 bdhess 在评论中所说,这可能是由于 Maven “有用”并在构建过程中破坏了数据。请参阅Maven 文档了解如何避免这种情况。

下面的解决方案也有效,但不那么简单。


Tamer 和我聊了一会儿,得到了解决方法:

  • 在将输出gcloud包含在src/main/resources.
  • 使用 .读取文件后解码文件java.util.Base64
  • 将解码后的字节传递给 KMS API。

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

我会在这周的某个时候尝试重现它。

于 2019-03-10T23:07:09.697 回答
0

我做了这些修改,然后在@hjfreyer 的大力帮助下,它就像一个魅力

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

  • 运行这个命令 -->

    gcloud kms 加密 --location global --plaintext-file PATH_TO_SECRET_FILE --ciphertext-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));
于 2019-03-11T05:17:01.783 回答
0

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

cat secret.enc | gcloud kms decrypt \
  --location=global \
  --keyring=keyring \
  --key=key \
  --ciphertext-file=- \
  --plaintext-file=decrypted_secret.txt
于 2020-06-16T09:49:26.477 回答