2015-04-28 13 views
11

Obecnie uczę się JavaFX i jestem trochę zdezorientowany faktem, że PasswordField w JavaFX nie ma metody, która zwraca char lub nawet tablicę bajtową hasła. Zamiast tego muszę użyć getText(), która zwraca String.Dlaczego JavaFx PasswordField zwraca zawartość jako ciąg?

Jak można przeczytać here huśtawka postanowiła oznaczyć metodę getText() jako zdefragmentowaną i mówi programiście, aby użył metody getPassword(), która zwraca tablicę znaków.

Jeśli się nie poddam poprawnie, to tablice znaków są o wiele bezpieczniejsze, ponieważ można je całkowicie usunąć z pamięci RAM, ustawiając wszystkie wartości na 0. Dlaczego więc Oracle zdecydowało się użyć łańcuchów w JavaFx? Czy jest jakiś nowy sposób na usunięcie strun ze sterty?

EDYCJA: O ile mi wiadomo, hasła char są daleko oszczędzające, ponieważ możemy je usunąć, kiedy tylko chcemy (nadpisując je), co nie ma miejsca w przypadku Ciągów.

+0

Wygląda na to, że mówisz, że nie ma metody "getPassword()", a jedynie metoda 'getText()', którą przeczytałeś, jest ostatnio przestarzała. Czy używasz nieaktualnej biblioteki JavaFX? To może wyjaśnić, dlaczego ta metoda nie jest dostępna. – mmcrae

+0

@mmcrae Nie, pole passwordField w JavaFX 8 nie ma metody getPassword, jak można zobaczyć tutaj: [link] (https://docs.oracle.com/javase/8 /javafx/api/toc.htm) – Brotcrunsher

+1

Nie powiedziałbym, że tablice char są ** daleko ** bezpieczniejsze. Pracujesz w pamięci VM bez względu na typ danych. Spójrz na ten [powiązany wpis] (http://stackoverflow.com/questions/29368926/safe-way-to-get-password- from-passwordfield-in-javafx) i jego komentarze, aby uzyskać więcej informacji. – OttPrime

Odpowiedz

0

Naprawdę, tablica znaków używa tablicy znaków w swojej podstawowej implementacji. Oba są przechowywane w VM, a oba są prawdopodobnie niepewne.

Jeśli nie chcesz polegać na śmieciu, aby wyczyścić hasła i zniszczyć ślady, zrób to, co zaproponował jewelsea w komentarzach i napisz własne.

Dlaczego? Jedynym podmiotem, który może naprawdę odpowiedzieć, dlaczego wszystko dzieje się w Javie, jest Oracle.

0

To, co mówisz, ma absolutną rację, nie możesz polegać na śmieciu. Jednak funkcja char[] umożliwia programowe usuwanie znaków, na przykład: Arrays.fill(password, (char)0);

W pamięci nadal będzie znajdować się nazwa char[], jednak zawartość zniknęła.

Zgadzam się z pierwotnym autorem pytania, nie mając metody char[] getPassword() jest niedopuszczalne dla pola hasła.

Powiązane problemy