Почему getText() в JPasswordField устарел?
Я никогда раньше не думал, только я использовал метод getPassword
, возвращающий массив символов, и я видел, что метод getText
был устаревшим. Но теперь, когда я думаю, почему этот метод был устарел?.
Документация по Java объясняет:
Устаревшие. Начиная с платформы Java 2 v1.2, заменяется на getPassword
.
Выбирает часть текста, представленную компонентом. Возвращает пустая строка, если длина равна 0.
Из соображений безопасности этот метод осуждается. Используйте вместо этого метод getPassword
.
Но каковы эти соображения безопасности? Любые идеи об этом?
Спасибо заранее.
Ответы
Ответ 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());