2015-04-28 16 views
11

Attualmente sto imparando JavaFX e sono un po 'confuso sul fatto che il Campo password in JavaFX non ha un metodo che restituisce un array di byte o anche di byte della password. Invece devo usare getText() che restituisce una stringa.Perché JavaFx PasswordField restituisce il contenuto come una stringa?

Come si può leggere here swing ha deciso di contrassegnare il metodo getText() come depredato e dice al programmatore di utilizzare invece getPassword(), che restituisce un array di caratteri.

Se correttamente corretto, gli array di caratteri sono molto più sicuri perché è possibile cancellarli completamente dalla RAM impostando tutti i valori su 0. Quindi perché Oracle ha deciso di utilizzare le stringhe in JavaFx? C'è un nuovo modo per rimuovere le stringhe dall'heap?

EDIT: Per quanto ne so, le password di char sono di gran lunga più risparmiate perché possiamo eliminarle quando vogliamo (sovrascrivendole), il che non è il caso delle stringhe.

+0

Sembra che tu stia dicendo che non esiste il metodo 'getPassword()', solo un metodo 'getText()', che hai letto è deprecato di recente. Stai usando una lib JavaFX obsoleta? Questo potrebbe spiegare perché non vedi quel metodo disponibile – mmcrae

+0

@mmcrae No, il campo password in JavaFX 8 non ha il metodo getPassword, come puoi vedere qui: [link] (https://docs.oracle.com/javase/8 /javafx/api/toc.htm) – Brotcrunsher

+1

Non direi che i char array sono ** molto ** più sicuri. Stai lavorando nello spazio di memoria della VM indipendentemente dal tipo di dati. Dai un'occhiata a questo [post correlati] (http://stackoverflow.com/questions/29368926/safe-way-to-get-password-from-passwordfield-in-javafx) e i suoi commenti per maggiori informazioni. – OttPrime

risposta

0

In realtà, un array di stringhe utilizza un array di caratteri nella sua implementazione fondamentale. Entrambi sono memorizzati nella VM ed entrambi sono probabilmente insicuri.

Se non si vuole fare affidamento sul garbage collector per ripulire le password e distruggere le tracce, fare ciò che jewelsea ha suggerito nei commenti e scrivere il proprio.

Per quanto riguarda il motivo? L'unica entità che può davvero rispondere perché qualcosa accade in Java è Oracle.

0

Quello che dici è assolutamente giusto, non puoi fidarti del garbage collector. Tuttavia, avendo un char[] consente di eliminare a livello di codice con i caratteri, ad esempio: Arrays.fill(password, (char)0);

Il char[] esisterà ancora nella memoria, tuttavia il contenuto è andato.

Sono d'accordo con l'autore originale della domanda, non avendo un metodo char[] getPassword() non è accettabile per un campo password.