2015-07-06 3 views
2

String s в Java поддерживаются в течение некоторого времени, потенциально a long while. Это хорошо, если только String не содержит фактического пароля пользователя. Character arrays are suggested, потому что они не являются неизменными и могут быть очищены быстрее. (Будем надеяться, что никогда не будет атаки «Bitter Coffee», которая работает как Heartbleed, а против JVM (дамп удаленной кучи)).Как уменьшить площадь поверхности атаки пароля в памяти весной?

Я заметил, что Spring Security PasswordEncoder принимает CharSequence не строку, возможно, по этой причине. Однако я не уверен, какой объект я должен использовать для хранения пароля в предварительном хешировании памяти. Будет ли StringBuilder уместным? как это будет выглядеть? Я даже менее уверен, создаю ли REST API (с Джексоном под капотом через Spring Data или Spring MVC), как я могу сохранить это от String.

Как я могу кодировать JSON REST API для создания и обновления паролей, будучи максимально безопасным и избегая различных проблем с использованием String?

+2

Прежде, чем вы доберетесь до весенней безопасности, вам придется избегать того факта, что большинство REST-фреймворков, включая весеннюю безопасность, встроенной веб-безопасности, извлекает пароль как параметр запроса ... Что такое String. –

ответ

1

Как я могу закодировать API JSON REST для создания/обновления паролей в то время как быть как можно более безопасным и избежать различных проблем с использованием строк?

Ну ключи API API не являются настоящими паролями. У вас есть контроль над тем, как создаются ключи API, чтобы вы могли создать некоторую случайную строку, которая будет иметь очень низкое столкновение (т. Е. Двойной UUID) и очень низкую общую подстроку (в случае дедуплирования). После того, как клиент входит в REST API с помощью ключа, вы можете использовать временные токены, тем самым повышая вероятность того, что ключ API получит сбор мусора.

Что касается реальных паролей, которые используются для регистрации человека (возможно, для сброса ключа API), на самом деле у вас мало вариантов, поскольку почти каждый контейнер сервлетов будет преобразовывать параметры запроса в строки. Одним из вариантов cheesy является наличие клиента через Javascript (или независимо от ваших клиентов). Base64 кодирует пароль, а затем добавляет разделитель, а затем добавляет случайно сгенерированный номер или строку в пароль. На самом деле это не для обфускации, а для снижения вероятности сохранения одной и той же строки. Конечно, вы должны быть осторожны, чтобы декодировать в массив символов или байтов, а затем удалить случайный суффикс, манипулируя массивом символов или байтов (см. CharBuffer).

Другим сложным вариантом является подход облака микросервиса. Просто сделайте службу проверки подлинности, состоящую из нескольких крошечных циклических экземпляров robin, которые выполняют только аутентификацию. Быстрое перезапуска этих экземпляров JVM (для сброса памяти). Или, если они достаточно малы, они, надеюсь, собирают мусор чаще.

Предположим, что в вашем репозитории данных есть соленые пароли (в противном случае эта мера предосторожности довольно спорная).

Чтобы быть честным, хотя существует так много других угроз, что я действительно не думаю, что это стоит усилий для большинства случаев использования в среде HTTP-сервера.

Причина, по которой Java Swing использует char[] для пароля, поскольку Swing используется для среды рабочего стола. В настольных средах гораздо чаще появляются вредоносные программы, такие как вирус/шпионское ПО, которые могут выполнять некоторые функции памяти для паролей.

Учитывая это, на самом деле клиенты, о которых вы должны беспокоиться, а не о сервере.

+0

Да, API-интерфейс, который я создаю, в первую очередь предназначен для обратной связи и пользовательского интерфейса, написанного угловым или что-то еще, и моя сущность в настоящее время преобразуется через BCryptPasswordEncoder. Мне нравится ваше представление о том, что является эффективной солью на стороне клиента. Для этого можно использовать csrfToken, а также проверить его. Будем надеяться, что никогда не будет удаленной атаки памяти, но я беспокоюсь, что такие функции, как «Отладчик Java через HTTP» + «String dedup», делают это более вероятным. Также думать об этом может означать, что мы можем создавать функции, которые делают его менее вероятным. – xenoterracide

+0

Также помните, что Java не является C или C++ и не имеет неправильной арифметики указателя, переполнения буфера и т. Д. Поэтому, хотя по-прежнему плохо, что пароли, зависающие в памяти, не так плохи по сравнению с другими языками, которые не имеют выделенной памяти. –

+0

Право, «мой код» никогда не вызовет проблемы. но Java имеет точку доступа, и написан на C? у которого есть это ... Я не говорю, что это когда-нибудь случится, но просто подумайте о том, что, если, наихудший сценарий. Подобно тому, как кто-то ошибался, ошибка ... языковая ошибка ... или .. (что вы имеете в виду, что вы включили отладчик через http на prod с паролем123). Также я предположил, что это может быть просто недостатком знаний/документации. – xenoterracide

Смежные вопросы