Проблема Google Cloud KMS с расшифровкой - PullRequest
0 голосов
/ 10 марта 2019

Я новичок в 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

Можете ли вы помочь мне и скажите, что отсутствует в Google Docs?

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Обновление : Как говорится в комментарии bdhess, это, вероятно, связано с тем, что Maven был "полезным" и повредил данные в процессе сборки. См. Maven docs , чтобы узнать, как этого избежать.

Решение ниже также работает, но не так просто.


Мы с Тамером немного поболтали и нашли обходной путь:

  • Кодировать вывод из gcloud в base64, прежде чем включать его в файл в src/main/resources.
  • Расшифруйте файл после прочтения с помощью java.util.Base64.
  • Передать декодированные байты в API KMS.

По какой-то причине байты были повреждены между созданием файла с gcloud и чтением байтов с getResourceAsStream(). Из приведенного выше кода я не вижу, где может происходить повреждение, и кажется, что чтение в двоичных ресурсах должно быть полностью поддержано. Но что-то ломается где-то в случае с Тамером.

Я постараюсь воспроизвести это когда-нибудь на этой неделе.

0 голосов
/ 11 марта 2019

Я сделал эти изменения, тогда они работали как шарм с большой помощью @hjfreyer

1 - чтобы зашифровать открытый текстовый секрет, я это сделал

  • запустить эту команду ->

    gcloud kms encrypt - глобальное расположение --plaintext-файл PATH_TO_SECRET_FILE --ciphertext-file PATH_TO_TMP_FILE --проект myProject - ключ ключа - кольцо ключей

  • Кодирование результата 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));
...