Каковы причины безопасности для JPasswordField.getPassword ()? - PullRequest
4 голосов
/ 06 января 2012

Начиная с Java 1.2, JPasswordField.getText() устарела "по соображениям безопасности", поощряя использование метода getPassword() "для большей безопасности".

Однако мне удалось получить пароль, сохраненный в JPasswordField, по крайней мере, в Oracle JRE 1.7, путем анализа дампа кучи (JPasswordField instance -> model -> s -> array).

Так как же JPasswordField.getPassword() помогает защитить пароль?

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Ну, документация для него гласит:

Для большей безопасности рекомендуется очищать возвращаемый массив символов после использования, устанавливая каждый символ в ноль.

Но, конечно, если вы используете метод getText, вы получите String, которая является неизменной, поэтому вы не сможете выполнить ту же рекомендацию.

1 голос
/ 17 июля 2013

Ответ прост.Вот прагматический подход, который объясняет разницу между getPassword() и getText()

JPasswordField jt=new JPasswordField("I am a password");
System.out.println("The text is "+jt.getText());
System.out.println("The password is "+jt.getPassword());

Вывод

I am a password
[C@1e4a47e

Метод getPassword() возвращает паролькак char[], тогда как getText() возвращает пароль в виде простого текста, то есть в виде String.

Однако, если вы печатаете так,

System.out.println(new String(jt.getPassword()));

Этомного равно getText() в JPasswordField.Однако это не означает, что getPassword() использует getText() для внутреннего использования, а затем преобразовывает его в массив char.

В методе getPassword() используется нестроковый API, то есть Segment.Однако Segment снова является неизменным, а метод getPassword() возвращает массив символов из Segment и возвращает его.

Однако, поскольку String является неизменным, а char[] - нет, a char[] считается вполне безопасным, поскольку его можно уничтожить.

1 голос
/ 06 января 2012

Примечание по безопасности, хотя getPassword () внутренне использует getText ()

Хотя класс JPasswordField наследует метод getText, вместо него следует использовать метод getPassword.Мало того, что getText менее безопасен, но в будущем он может вернуть видимую строку (например, "**") вместо напечатанной строки.

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

...