2016-04-24 16 views
3

Leider dieses Thema wieder zu bringen, habe ich eine ähnliche Frage sorgfältig Why does JPasswordField.getPassword() create a String with the password in it?JPasswordField.getPassword() ist immer noch nicht gesichert?

aber ich denke immer noch in JPasswordField Implementierung gelesen haben eine Lücke besteht. Ich sehe immer noch, dass das Passwort im Speicher in verschiedenen Datentypen gespeichert ist, nicht in String.

Schritt, den ich tat: die von Oracle JPasswordField Demo Code https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/PasswordDemoProject/src/components/PasswordDemo.java

und führen Sie es zum Download. Es öffnet sich der Passwortdialog.

password dialog

Typ in "Bugaboo"

Hit eingeben und sehen, dass das Passwort korrekt ist. (I das in Passwort eingegeben löschen, das Endergebnis ist das gleiche mit/ohne diesen löschen)

nun an dieser Stelle aufgrund des Code in

Passwort Inhalt
//Zero out the password. 
    Arrays.fill(correctPassword,'0'); 

Ich erwarte, dass es löschen kein übriggebliebener Bugaboo im Speicher, jedoch gibt es. benutzte ich http://www.sweetscape.com/010editor/ den Speicherinhalt zu prüfen und noch „Bugaboo“ sehen im Klartext bugaboo

Fazit: Der Grund dafür ist, dass JPasswordField intern PlainDocument verwenden und es Wurf Ihr Gedächtnis mit der ganzen Geschichte von dem, was in verkeilt wurde Daher können Sie den Kennwort-Klartext im Speicher nicht vollständig löschen.

Daher hat die Mühe, getPassword() als char [] zu verwenden und danach zu löschen, keinen großen Nutzen.

Bitte erleuchten Sie mich.

+0

Nun, es muss irgendwo gespeichert werden, * nu *? – EJP

+1

@EJP Der Punkt ist, dass Sie ein 'PlainDocument' nicht zuverlässig löschen können. Die Antwort auf diese Frage lautet also "Ja". (FWIW IIRC, Sie erhalten auch eine 'Zeichenfolge', wenn Sie einen' ActionListener' hinzufügen.) –

+0

@ TomHawtin-tackline Der Punkt ist, dass * nicht gesichert werden kann, wenn 'gesichert' bedeutet, dass das Passwort nicht im Speicher ist ". Alles, was erreicht werden kann, ist eine 'char []' -basierte API, um die offensichtlicheren 'String'-basierten Exploits zu vermeiden. – EJP

Antwort

0

Wenn Sie das Passwort von JPasswordField abrufen, erhalten Sie nur eine Kopie. Das Objekt Document in der JPasswordField hat immer noch ein eigenes Zeichen-Array mit dem Passwort. Ich denke, das ist der Wert, den Sie in Ihrem Speicher-Viewer sehen.

Jetzt wäre eine Idee zu löschen, die JPasswordField nach einem Passwort verifiziert hat:

passwordField.setText(""); 

Ironischer dies wirft ein UndoableEditEvent, die ein javax.swing.text.GapContent$RemoveUndo Objekt, das das Passwort als String Objekt speichert - etwas, was wir versuchen, zu vermeiden an erster Stelle.

Verwandte Themen