Как сохранить мой ключ для шифрования на aws? - PullRequest
0 голосов
/ 09 июля 2020
• 1000 Хранить ключ в aws облачной системе Java

Я пытался использовать KMS & Crypto sdk, но он не работает. (например) результат значения шифрования изменяется каждый раз, когда я вызываю метод с таким же простым текстом.

Есть ли у вас какие-нибудь идеи?

public String encrypt(String text) {
    String plaintext = text;
    try {
        ByteBuffer byteBuffer = getByteBuffer(plaintext);
        EncryptRequest encryptRequest = new EncryptRequest().withKeyId(key_arn).withPlaintext(byteBuffer);
        EncryptResult encryptResult = client.encrypt(encryptRequest);
        String ciphertext = getString(java.util.Base64.getEncoder().encode(encryptResult.getCiphertextBlob()));
        plaintext = ciphertext;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return plaintext;
}

public String decrypt(String text) {
    String bb = null;
    try {
         byte[] ciphertextBytes = text.getBytes();

        DecryptRequest request = new DecryptRequest();
        request.setCiphertextBlob(ByteBuffer.wrap(ciphertextBytes));

        DecryptResult result = client.decrypt(request);

        // Convert to byte array
        byte[] plaintext = new byte[result.getPlaintext().remaining()];
        ByteBuffer a = result.getPlaintext().get(plaintext);
        bb = getString(a);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bb;
}

1 Ответ

1 голос
/ 11 июля 2020

Это сложный вопрос, чтобы дать краткий ответ, потому что существует множество деталей и базовых знаний о том, что go в криптографии и правильно использует AWS криптографические возможности.

Сначала укажите c вопрос - разные значения из одного и того же открытого текста допустимы и ожидаемы. Encrypt возвращает разные значения для одного и того же простого текста, поскольку он присоединяет к обычному тексту дополнительные данные, например Initialization Vector (IV). Это способ точно включить недетерминированные c данные в простой текст, чтобы вы не получали точно такой же зашифрованный текст из того же простого текста при использовании одного и того же ключа.

Что еще более важно, обратите внимание, что Encrypt и Decrypt являются не инструментами общего назначения - они предназначены для обработки небольших полезных нагрузок (<8 КБ), в частности <code>Data Keys. Итак, где вы go отсюда, будет зависеть от того, какие данные вы шифруете. Если вам просто нужно расшифровать небольшое значение, такое как пароль, вы можете продолжить с Encrypt/Decrypt и не беспокойтесь, что две операции Encrypt производят разные зашифрованные тексты. Если вам нужно зашифровать файлы или другие произвольные фрагменты данных, читайте дальше.

AWS продвигает идею Envelope Encryption, которая представляет собой представление о том, что ключ, используемый для фактического шифрования / дешифрования, хранится вместе с данными. он защищает и сам шифруется / дешифруется с помощью отдельного главного ключа. В случае AWS это Customer Master Key (CMK), который никогда не покидает KMS.

Таким образом, вы можете использовать Encrypt для шифрования созданного вами ключа шифрования, или вы можете использовать метод AWS GenerateDataKey на 1) создать ключ и 2) зашифровать его для вас. Это вернет как открытый текст (base64), так и версию ключа зашифрованного текста. Используйте открытый текст в памяти, сохраните зашифрованный текст на диск.

Более типичный рабочий процесс будет примерно таким:

  • Вызов GenerateDataKey - вам нужно указать KeyId и KeySpec (AES_128 или AES_256). Есть также варианты для генерации асимметричных c ключей.
  • Результат включает как простой текст, так и зашифрованную версию сгенерированного ключа. Сохраните зашифрованную версию.
  • Через некоторое время позвоните Decrypt, когда вам понадобится ключ.
  • Используйте открытый текст из этого метода Decrypt в качестве ключа в вашей локальной криптографии. code.

AWS фактически предоставляет отдельную библиотеку, которая сделает все это за вас - AWS Encryption SDK с поддержкой ряда языков, включая Java. Я не использовал его широко, но он обеспечивает основу для шифрования конвертов с помощью передовых методов (какие алгоритмы, основные и ключи данных и т. Д. c). Взгляните (ссылка ниже).

Надеюсь, это поможет; шифрование сложно реализовать.

Для получения дополнительной информации:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...