Почему JavaFx PasswordField возвращает это содержимое как String?
В настоящее время я изучаю JavaFX, и я немного смущен тем, что PasswordField в JavaFX не имеет метода, который возвращает массив char или даже байтовый пароль. Вместо этого я должен использовать getText(), который возвращает строку.
Как вы можете прочитать здесь, swing решил пометить метод getText() как лишенный и попросит программиста вместо этого использовать getPassword(), который возвращает char массив.
Если я правильно понял, массивы char намного безопаснее, потому что вы можете полностью стереть их из ОЗУ, установив все значения равными 0. Тогда почему Oracle решил использовать строки в JavaFx? Есть ли новый способ удаления строк из кучи?
EDIT: насколько я знаю, char пароли гораздо более безопасны, потому что мы можем удалить их, когда захотим (перезаписываем их), что не относится к строкам.
Ответы
Ответ 1
Действительно, массив строк использует массив char в своей основной реализации. Оба они хранятся в виртуальной машине, и обе они, возможно, небезопасны.
Если вы не хотите полагаться на сборщика мусора, чтобы очистить пароли и уничтожить следы, сделайте то, что драгоценность предложила в комментариях, и напишите свой собственный.
В чем причина? Единственный объект, который действительно может ответить, почему что-то происходит в Java, - это Oracle.
Ответ 2
То, что вы говорите, абсолютно правильно, вы не можете полагаться на сборщика мусора. Однако, имея char[]
, вы можете программно очищать символы, например: Arrays.fill(password, (char)0);
char[
] все еще будет существовать в памяти, однако содержимое не прошло.
Я согласен с оригинальным автором вопроса, не имея метода char[] getPassword()
, неприемлемого для поля пароля.