Как реализовать шифрование и дешифрование данных с помощью AWS KMS CMK и ключей данных в Java?
Я сравнительно плохо знаком с облачной средой AWS, поэтому мои знания в целом ограничены. Я заранее прошу прощения, если это простые прямые вопросы и за образцы.
Я также посмотрел вокруг на SO, чтобы получить больше информации, но не смог найти много. Возможно, я ищу не ту вещь. Любая помощь будет оценена.
Я пытаюсь использовать AWS KMS для шифрования одного элемента данных в моем приложении. После ознакомления с документацией мое понимание таково:
- Мне нужно иметь CMK в моем аккаунте AWS. Я создал управляемый AWS CMK, созданный в моей учетной записи.
- Запишите идентификатор ключа или псевдоним CMK, который я получил для своего CMK с консоли.
- Создайте объект GenerateDataKeyRequest, передав Key ID или Alias и KeySpec.
- Сгенерируйте ключ данных, используя метод awskmsClient.generateDataKey() и передав вышеупомянутый объект GenerateDataKeyRequest.
- Вышеупомянутый шаг даст мне объект GenerateDataKeyResult, который будет иметь значения "открытого текста" и "ciphertextblob" ключа данных.
У меня есть этот код, как показано ниже:
AWSKMS awsKmsClient = AWSKMSClientBuilder.standard().build();
GenerateDataKeyRequest keyRequest = new GenerateDataKeyRequest()
.withKeyId("alias/MyKeyAlias")
.withKeySpec("AES_256");
GenerateDataKeyResult dataKeyResponse = awsKmsClient .generateDataKey(keyRequest );
System.out.println("Plaintext Data Key: " + dataKeyResponse.getPlaintext());
System.out.println("Ciphertext Data Key: " + dataKeyResponse.getCiphertextBlob());
В документации говорится, что для шифрования моих данных используется ключ данных "незашифрованный текст", а при удалении ключа данных "незашифрованный текст".
Мой первый вопрос: как мне зашифровать мои данные с помощью "открытого текста" ключа данных?
Я не могу найти место в документации, где говорится о том, как это сделать. Или какой API использовать. В классе AWSKMSClient есть метод " шифрования ", но его можно использовать только с Key ID ключа CMK, а не с ключом данных. Или я не так понимаю?
Затем в документации также говорится о хранении зашифрованных данных и ключа данных " ciphertextblob ". Это называется Envelop Encryption в терминах AWS KMS. Я не могу понять, как мне это сделать. Любая помощь в этом отношении будет высоко оценена.
Согласно документации, мы должны предпринять следующие шаги для расшифровки:
Используйте сохраненный ключ данных "ciphertextblob", чтобы получить ключ данных "незашифрованный".
Используйте указанный выше ключ данных в виде открытого текста для расшифровки данных.
У меня есть пара вопросов по этому вопросу, как показано ниже:
Каков наилучший способ хранения зашифрованных данных и ключа данных " ciphertextblob " в базе данных?
Как я могу получить ключ данных " незашифрованного текста " из сохраненного ключа данных "ciphertextblob"?
И, наконец, как мне расшифровать мои данные, используя "незашифрованный" ключ данных, полученный на шаге выше?
Буду очень признателен, если вы сможете предоставить пример кода для вышеуказанных вопросов. Или, пожалуйста, укажите мне правильное направление для достижения вышеизложенного.
Спасибо.
2 ответа
Мой первый вопрос: как мне зашифровать мои данные с помощью "открытого текста" ключа данных?
Вы можете использовать функцию шифрования по умолчанию, так как я вижу, что вы используете Java, вы можете заглянуть в мой блог о шифровании.
Затем в документации также говорится о хранении зашифрованных данных и ключа данных "ciphertextblob". Это называется Envelop Encryption в терминах AWS KMS. Я не могу понять, как мне это сделать. Любая помощь в этом отношении будет высоко оценена.
Вы сохраняете свой зашифрованный текст (зашифрованные данные) и ключ данных "ciphertextblob", возвращаемый операцией generateDataKey. Как вы используете ваши данные, зависит от вас (локальный диск, S3, БД, другие службы...).
Ключ данных "ciphertextblob" будет позже использован для запроса простого ключа шифрования из км, чтобы вы могли расшифровать свои данные
Согласно документации, мы должны предпринять следующие шаги для расшифровки:
Используйте сохраненный ключ данных "ciphertextblob", чтобы получить ключ данных "незашифрованный".
Используйте указанный выше ключ данных в виде открытого текста для расшифровки данных.
Действительно, операция дешифрования возвращает простой ключ шифрования данных из "ciphertextblob", так что вы можете расшифровать свои данные (опять же - шифрование / дешифрование данных полностью зависит от вас, но настоятельно рекомендуется использовать какой-то безопасный стандарт, такой как AES)
Каков наилучший способ хранения зашифрованных данных и ключа данных "ciphertextblob" в базе данных?
Обратите внимание, что зашифрованные данные являются двоичными, поэтому вы можете видеть их в зашифрованном виде (например, base64), поэтому лучший способ - сохранить их в виде текста (varchar).
Как я могу получить ключ данных "незашифрованного текста" из сохраненного ключа данных "ciphertextblob"?
вызывая операцию decrypt() - она возвращает простой ключ шифрования данных из "ciphertextblob"
И, наконец, как мне расшифровать мои данные, используя "незашифрованный" ключ данных, полученный на шаге выше?
опять же, используя криптографическую функциональность по умолчанию:)
Вы можете использовать Java Cryptography Extension (JCE) для шифрования или дешифрования данных. Я не совсем уверен, как лучше всего хранить ключ данных ciphertextblob и зашифрованные данные, но я считаю, что это должно зависеть от вашего приложения и требований. Чтобы получить ключ данных в виде открытого текста из ciphertextblob, вам необходимо вызвать API-интерфейс KMS Decrypt, т. Е. Использовать CMK для дешифрования ключа данных ciphertextblob и получить ключ данных в виде открытого текста.
Вам следует использовать AWS Encryption SDK, и вам не нужно беспокоиться об этих вопросах:)
Пример кода можно найти здесь.