Это сложный вопрос, чтобы дать краткий ответ, потому что существует множество деталей и базовых знаний о том, что 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). Взгляните (ссылка ниже).
Надеюсь, это поможет; шифрование сложно реализовать.
Для получения дополнительной информации: