Консоль 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). Когда он хранится в массиве символов, вы можете очистить массив и, таким образом, удалить пароль из памяти после его проверки.