Обработка криптовых исключений

Этот довольно простой fragment кода довольно распространен при обработке шифрования / расшифровки на Java.

final Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); cipher.doFinal(*something*); 

Эти три линии в одиночку, потенциально бросают шесть исключений, и я не уверен, что является самым чистым (с точки зрения читаемости кода) способом их обработки. Попробуйте с шестью уловками, которые действительно кажутся мне запахом.

Есть ли микроstreamи или лучшие практики, которых я, очевидно, не хватает, работая с такими объектами?

РЕДАКТИРОВАТЬ

Извините, я думаю, что не очень хорошо себя объяснил. Мой вопрос заключается не в том, чтобы избежать предложения try \ catch, но если есть общий способ справиться с подобными ситуациями.

Исключения составляют

 NoSuchPaddingException, NoSuchAlgorithmException InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException 

Вы указали следующие исключения:

 NoSuchPaddingException, NoSuchAlgorithmException InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException 

Теперь все это GeneralSecurityException , поэтому было бы легко поймать их всех. Но, глядя на прецедент, вы, вероятно, не хотите этого делать.

Если вы посмотрите на причины исключений, вы обнаружите, что любое из этих исключений – за исключением последних двух – вызывается только при генерации реализации алгоритма или ключа. Я думаю, что разумно, что после того, как вы протестировали свое приложение, эти значения остаются более или менее статичными. Следовательно, было бы логично бросить – например, IllegalStateException . IllegalStateException – это исключение во время выполнения, которое вам не нужно бросать или ловить. Конечно, вы должны указать исключение безопасности как причину исключения.

Теперь последние два исключения: исключение BadPaddingException и IllegalBlockSizeException отличаются. Они зависят от фактического зашифрованного текста, поэтому они зависят от ввода алгоритма. Теперь, как правило, вы всегда должны проверять целостность ввода перед его подачей в экземпляр Cipher , инициированный для дешифрования, например, сначала проверяя контрольную сумму HMAC). Поэтому в этом смысле вы все равно можете избавиться от исключения во время выполнения.

Если вы не проверяете целостность, вы должны делать что-то другое с исключением, например, повторно бросать его как исключенное (другое?) Исключение. Если вы берете этот маршрут, вы должны понимать, что нужно атаковать оскорбительные атаки; если противник может попытаться и расшифровать шифрованный текст несколько раз и может выяснить, правильно ли заполняется или нет, конфиденциальность сообщения теряется.

Вероятно, лучше всего использовать отдельные блоки try / catch для построения и инициализации Cipher и самого расшифровки. Вы также можете поймать исключения BadPaddingException и IllegalBlockSizeException перед обработкой исключения GeneralSecurityException . Начиная с Java 7, вы также можете использовать многозадачные заявления (например, catch(final BadPaddingException | IllegalBlockSizeException e) ).


Наконец, некоторые примечания:

  • Остерегайтесь того, что исключение может быть выбрано для размеров ключей AES 192 бит и 256 бит, если неограниченные криптовальные файлы не установлены (для получения дополнительной информации см. Сайт Oracle JavaSE ); вы должны проверить, разрешен ли размер ключа при запуске приложения;
  • И BadPaddingException и IllegalBlockSizeException могут быть созданы из-за атак или потому, что данные не были полностью присутствующими;
  • BadPaddingException также может быть BadPaddingException если ключ неверен.

Если вы хотите потерять определенную специфику, все исключения Crypto расширяют GeneralSecurityException , вы можете просто поймать их.

Лучший способ справиться с этим – создать исключение бизнес-classа (исключение MyModuleException или что-то еще), а затем восстановить это исключение, добавляя исключения Crypto, чтобы вызвать часть. Таким образом, ваш метод будет генерировать только одно исключение, а не шесть, что было бы намного проще управлять в других слоях вашего приложения.

 public void myMethod(...) throws MyModuleException { try { final Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); cipher.doFinal(*something*); } catch(Crypto1Ex ex){ throw new MyModuleException("something is wrong", ex); //ex added, so it is not lost and visible in stacktraceses } catch(Crypto1Ex ex){ throw new MyModuleException("something is wrong", ex); } //etc. } - public void myMethod(...) throws MyModuleException { try { final Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); cipher.doFinal(*something*); } catch(Crypto1Ex ex){ throw new MyModuleException("something is wrong", ex); //ex added, so it is not lost and visible in stacktraceses } catch(Crypto1Ex ex){ throw new MyModuleException("something is wrong", ex); } //etc. } 

В Java 7 вы можете справиться с этим еще проще (см. http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html )

  • Шифрование настроек приложения в web.config
  • Фундаментальное различие между алгоритмами Hashing и Encryption
  • Как безопасно хранить ключи шифрования в java?
  • Как защитить общие настройки Android?
  • Безопасность сообщений WCF без сертификата и windows auth
  • Interesting Posts

    Доступ к идентификатору / имени пользователя учетной записи Google через Android

    Безопасность беспроводной мыши и клавиатуры

    Не удалось установить доверительные отношения для безопасного канала SSL / TLS – SOAP

    мультимножество, карта и hash-карта сложности

    Добавление файлов в отдельные объекты в Xcode 4

    Как проверить массив входов с помощью validate plugin jquery

    Какая папка App_Data используется в Visual Studio?

    Удаление дубликатов из NSMutableArray

    Google Chrome: просмотр фонового изображения не работает

    Ресурс url, который является точкой (% 2E)

    Как избежать «ConcurrentModificationException» при удалении элементов из «ArrayList» при его повторении?

    Отклонить двоичный код с состоянием, ожидающим проверки (не может найти двоичную кнопку отклонения)

    Разделенные вкладки в awk

    Границы, не показанные в Firefox с граничным коллапсом на таблице, позиция: относительная по tbody или фоновый цвет на ячейке

    Как вы делаете Twitter-бутстрап-аккордеон, чтобы одна группа открылась?

    Давайте будем гением компьютера.