Google Cloud KMS 加密在命令行和 java 代码之间得到非常不同的结果

Google Cloud KMS encryption got very different results between command line and java code

我是 google 云的初学者。我有一个 java 代码,它使用 KMS 来加密一些凭证信息。最后它 returns 密文(一个 String 对象),这就是我需要的。它给了我这样的东西:

CiQAUxKMC06hZ7cuhlqdQQPGdNJqotwoKlSzjKmr+kwR3iMLg04SZABqmWMTCukKk0EVIDa1PpqqSIszczXGvt+nQN/jpV3DLEjXH3xkzdL0an9kiRIfLHryhcFwaYt/DczI4sy4VdZSoyKcszzZyGdVjISsyIbMnYINuqme1sa7GqLM98cXfnYzHjE=

EncryptResponse response = kms.projects().locations().keyRings().cryptoKeys()
            .encrypt(resourceName, request)
            .execute();
return response.getCiphertext();

现在我还想要一个可以做类似事情的 bootstrap 脚本。但是,当我如下使用命令行时。 encryption.txt 文件中的内容看起来不像字符串,而是一些 unicode 字符。有没有一种方法可以通过使用 gcloud kms 命令行来实现上述漂亮的加密字符串?

export ENCRYPTION=$(gcloud kms encrypt --location=global --keyring=$KEYRING --key=$KEY --plaintext-file=text.txt --ciphertext-file=encryption.txt)

Google Cloud KMS 使用 Base64 编码的 AES-256 加密 keys。 您应该能够使用 base64 库解码密文。

有两件事。 一种是 API 调用。

curl -s -X POST "https://cloudkms.googleapis.com/v1/projects/<PROJECT>/locations/<LOCATIO >/keyRings/<KEY_RING>/cryptoKeys/<KEY>:encrypt" \ 
-d "{\"plaintext\":\"$(echo hello world | base64)\"}" \
-H "Authorization:Bearer $(gcloud auth application-default print-access-token)" \  -H "Content-Type:application/json"

此 API 调用给出了可读的密文的 base64 编码值。

另一种方法是使用SDK(这里只说java SDK)

EncryptResponse.getCiphertext() 会 return 乱码,你必须使用 base64 对其进行编码以获得可读的密文

String cipherText = new String(Base64.getEncoder().encode(response.getCiphertext().toByteArray()))

API收到的上述字符串和密文的输出将匹配。

类似地,在使用 KMS 解码时,API 将给出文本的 base64 解码值,另一方面,您必须通过解码

手动将 SDK 调用的输出转换为字符串
 String decodedText = new String(Base64.getDecoder().decode(key)