Swing JPasswordField
имеет getPassword()
метод, который возвращает массив char. Мое понимание этого состоит в том, что массив можно обнулить сразу же после использования, чтобы у вас не было чувствительных вещей, которые долгое время висели в памяти. Старый способ получить пароль состоял в использовании getText()
, который возвращает объект String, но он устарел.
Итак, мой вопрос в том, почему он фактически используется Java во время процесса поиска, используя getPassword()
??? Чтобы быть яснее, я отлаживал свое тестовое приложение для чего-то еще **, я следил за вызовами и ошибками... getText()
в JPasswordField
был вызван и, конечно же, был создан хороший объект String с моим паролем и теперь висит вокруг памяти.
Попробуйте сами:
public class PasswordTest() {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPasswordField passField = new JPasswordField();
pass.addActionListener(new ActionListener() {
public ActionPerformed(ActionEvent evt) {
char[] p = passField.getPassword(); // put breakpoint
// do something with the array
}
});
frame.add(passField);
frame.setVisible(true);
frame.pack();
}
}
Следующий вопрос: это "скрытое" использование getText()
опасно каким-либо образом? Конечно, выделенный атакующий получит ваш пароль, если он скомпрометировал систему, я говорю о менее посвященной;)
** Я наткнулся на это, пока искал способ фактического отображения некоторых конфиденциальных данных в компоненте Swing без использования объекта String
. По-видимому, нет никакого способа сделать это, если я не захочу переписать часть (все?) API Swing.. не произойдет.