В Java, как я могу извлечь пароль из заголовка HttpServletRequest без создания объекта String?

Общее правило безопасности Java для обработки конфиденциальных данных (== пароли) рекомендует никогда не использовать объект String для хранения данных и вместо этого использовать массив байтов или символов. Я пытаюсь применить это руководство в обработчике HttpServlet. В частности, я использую подход с базовой аутентификацией, в котором учетные данные передаются в заголовке (это запрос GET, поэтому нет тела).

Проблема, с которой я сталкиваюсь, заключается в том, что невозможно получить данные заголовка без создания объекта String, что нарушает директиву с get-go. Я искал решение довольно тщательно и не нашел подходящей дискуссии. Кто-нибудь знает об этом?

ПРИМЕЧАНИЕ: это происходит через HTTPS, поэтому здесь нет проблемы с безопасностью соединения.

Ответ 1

Простой ответ заключается в том, что вы не можете получить параметр в любой другой форме, кроме строки. По крайней мере, не используя стандартные API сервлета. Но есть несколько возможных "выходов".

  • Если вы готовы стать действительно уродливым, вы можете на самом деле сломать абстракцию объекта String и охватить и перезаписать символы. (Строки на самом деле изменяемы, если вы готовы нарушить правила. Это одна из немногих ситуаций, когда это может быть оправдано.)

  • Для выполнения этого может быть нестандартное расширение API в вашей реализации веб-контейнера (скажем) HttpServletRequest. Если нет, вы можете получить исходный код и добавить его. (Предполагая, что вы используете веб-контейнер с открытым исходным кодом.)


Сказав, что ИМО подход "без строк" ​​к безопасности Java ошибочен или, по крайней мере, слишком завышен с точки зрения того, чего он добивается.

Подход "без строк" ​​защищает возможность того, что что-то может пробиться через адресное пространство вашего приложения, найти вещи, которые выглядят как строки, и вынюхивать возможные пароли. Теоретически это можно сделать:

  • взлом, который разбивает модель исполнения JVM и смотрит на необработанную память,
  • добавление отладчика Java и траление через доступные объекты,
  • используя "/dev/mem" или аналогично считыванию памяти процесса снаружи,
  • доступ к останкам образа программы для свопинга на жестком диске или
  • каким-то образом вызывая его дамп ядра и чтение дампа.

Однако все, кроме первого, требуют, чтобы плохой парень уже нарушил безопасность системы. И если плохой парень сделал это, есть другие (возможно, более простые) способы кражи паролей из вашей программы... которые подход "без строк" ​​не предотвратит.

И если вы беспокоитесь о взломе, который использует недостаток безопасности Java для чтения необработанной памяти, этот недостаток, вероятно, может использоваться другими способами; например для ввода кода, чтобы изменить способ обработки паролей кодом.

Таким образом, "никакие строки" не защищают от действительно тяжелых хаков или от случаев, когда ваша безопасность уже взорвана. ИМО, это не стоит усилий... если вы не обязаны осуществлять военную безопасность.