Консоль Java; readPassword, как массив защищает от определения значения пароля?

Я читал о классе java.io.Console в одной из учебных сертификатов java, возможно, я пропустил что-то фундаментальное из предыдущей главы, но может ли кто-нибудь объяснить ниже?

В нем упоминается, что метод readPassword возвращает массив символов вместо String, чтобы потенциальный хакер не нашел эту строку и не нашел пароль.

Как массив символов безопаснее? Если бы вы могли получить значения в массиве, не могли бы вы создать script для циклического использования различных комбинаций и, в конечном итоге, найти пароль?

Ответ 1

В документации :

Объект Console поддерживает безопасный ввод пароля с помощью метода readPassword. Этот метод защищает ввод пароля двумя способами. Во-первых, он подавляет эхо, поэтому пароль не отображается на экране пользователя. Во-вторых, readPassword возвращает массив символов, а не строку, поэтому пароль можно перезаписать, удалив его из памяти, как только он больше не понадобится.

Идея здесь состоит в том, что вы можете вызвать Arrays.fill (или эквивалент) в "пустой" массив char, как только вы 've проверял пароль, и с этой точки пароль больше не сохраняется в памяти. Поскольку Строки неизменяемы, Строка останется в куче до тех пор, пока она не будет собрана мусором - что, если ей удастся добиться интернирования, никогда не будет, и в любом другом случае все еще может быть "слишком длинным". Все это время он потенциально уязвим для обнюхивания из множества векторов.

Ответ 2

Это одна из тех самых лучших вещей. Это не имеет большого смысла, но мы делаем это для легкой жизни.

Если пароль находится в памяти, переполнение буфера может позволить его прочитать. Или он может быть сохранен в виде дампа ядра или спящего режима. Использование изменчивого char[] позволяет уничтожать данные после долгого узкого окна, если оно не было скопировано в строку, скопировано в другом месте, вероятно, в буферах, сборке мусора нравится перемещать объекты и т.д.

В Swing есть забавный пример, где JPasswordField предоставляет способ char[] для чтения данных, но, например, создаст String из данных, если у него есть прослушиватель действий (что очень часто способ его использования).

Ответ 3

A String - неизменяемый класс, и когда пароль хранится в String, вы не имеете контроля над его жизненным циклом, что означает, что он может быть доступен в памяти (и с учетом дампов памяти и т.п.) в течение длительного времени (даже если он не интернирован, где он будет в памяти до выхода JVM). Когда он хранится в массиве символов, вы можете очистить массив и, таким образом, удалить пароль из памяти после его проверки.