Как правильно выполнять аутентифицированное шифрование в Java? - PullRequest
11 голосов
/ 05 марта 2012

Аутентифицированное шифрование требует, чтобы мы использовали некоторый принятый стандарт для шифрования и аутентификации сообщения.Таким образом, мы оба зашифровываем сообщение и вычисляем MAC-адрес сообщения, чтобы убедиться, что оно не было подделано.

В этом вопросе описан способ выполнения усиления и шифрования на основе пароля:*

/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));

Но, насколько я могу судить, это не вычисляет MAC-адреса в зашифрованном тексте и поэтому будет небезопасным.Каков принятый стандарт для выполнения аутентифицированного шифрования в Java?

Ответы [ 2 ]

12 голосов
/ 06 марта 2012

Я бы рекомендовал использовать шифрование в режиме GCM. Он включен в последний JDK (1.7) по умолчанию. Он использует шифрование в режиме счетчика (потоковый шифр, заполнение не требуется) и добавляет тег аутентификации. Одним из больших преимуществ является то, что для этого требуется только один ключ, тогда как HMAC добавляет еще один ключ к соединению. Bouncy Castle также имеет реализацию, которая в целом совместима с реализацией Oracle.

Шифрование в режиме GCM также включено в RFC TLS и в XML encrypt 1.1 (оба не являются окончательными). Режим GCM обеспечивает все три функции безопасности: конфиденциальность, целостность и подлинность отправляемых данных. Строка будет "AES / GCM / NoPadding" вместо CBC, который вы сейчас развертываете. Как уже было сказано, убедитесь, что у вас установлена ​​последняя версия JDK от Oracle или установлен поставщик Bouncy Castle.

Также проверьте мой ответ здесь , который в основном касается строкового кодирования, но я также успешно попробовал режим GCM - см. Комментарий.

3 голосов
/ 05 марта 2012

При передаче файлов с одного сервера на другой через безопасный ftp я использую пары секретный / открытый ключ с закрытым ключом, находящимся на сервере «from», и открытым ключом, находящимся на сервере «to».

Использование пар секретного / открытого ключей является безопасным стандартом при передаче файлов.

Я считаю, что это также будет безопасным средством в контексте приложения Java.

Извлечение Созданиеи Проверка подписей и Создание открытых и закрытых ключей для получения дополнительной информации об использовании настройки пары секретный / открытый ключ для цифровых подписей в Java.

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