Консоль Java;readPassword, как массив защищает от определения значения пароля? - PullRequest
11 голосов
/ 10 августа 2010

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

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

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

Ответы [ 3 ]

13 голосов
/ 10 августа 2010

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

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

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

4 голосов
/ 10 августа 2010

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

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

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

2 голосов
/ 10 августа 2010

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

...