我是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文档中缺少什么吗?
答案 0 :(得分:2)
更新:正如bdhess在评论中所说,这可能是由于Maven在构建过程中“有帮助”并破坏了数据。有关如何避免这种情况的信息,请参见Maven docs。
下面的解决方案也可以,但是不太直接。
Tamer和我聊天了一段时间,并找到了解决方法:
gcloud
的输出包含在src/main/resources
中的文件中之前,先在base64中对其进行编码。java.util.Base64
读取文件后对其进行解码。由于某些原因,在使用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