Подтвердить что ты не робот

Почему getText() в JPasswordField устарел?

Я никогда раньше не думал, только я использовал метод getPassword, возвращающий массив символов, и я видел, что метод getText был устаревшим. Но теперь, когда я думаю, почему этот метод был устарел?.

Документация по Java объясняет:

Устаревшие. Начиная с платформы Java 2 v1.2, заменяется на getPassword.

Выбирает часть текста, представленную компонентом. Возвращает пустая строка, если длина равна 0.

Из соображений безопасности этот метод осуждается. Используйте вместо этого метод getPassword.

Но каковы эти соображения безопасности? Любые идеи об этом?

Спасибо заранее.

4b9b3361

Ответ 1

При вызове getText вы получаете String (неизменяемый объект), который не может быть изменен (кроме отражения), и поэтому пароль остается в памяти до сбора мусора.

При вызове getPassword вы получаете массив char, который может быть изменен, поэтому пароль действительно не останется в памяти.

Ответ 2

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

Вместо этого используйте массив char, вы можете проверить пароль, а затем немедленно скремблировать его.

Ответ 3

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

Если вы посмотрите на реализацию метода getPassword (как видно из вопроса SO @Garbage, размещенного как комментарий к вашему вопросу), вы можно увидеть это, избегая создания String.

Обратите внимание, что это также означает, что вы не должны делать что-то вроде

if ( Arrays.equals( "mySuperSecretPassword".toCharArray(), passwordField.getPassword() ) )

или вы все равно вставляете пароль в пул, а затем вы можете легко использовать метод getText.

Ответ 4

Попробуйте следующее:

String myPass=String.valueOf(passwordField.getPassword());