2016-04-24 13 views
3

申し訳ありませんが、私はまだJPasswordFieldの実装では抜け穴があると思いますが、私は慎重に別の同様の質問 Why does JPasswordField.getPassword() create a String with the password in it?JPasswordField.getPassword()はまだ保護されていませんか?

を読んだことが、再びこのトピックを表示します。私はまだ文字列ではなく、異なるデータ型のメモリに格納されているパスワードを参照してください。私がやった

ステップ: は、Oracle からhttps://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/PasswordDemoProject/src/components/PasswordDemo.java

をJPasswordFieldのデモコードをダウンロードして実行します。パスワードダイアログが表示されます。 "バガブー"

ヒットで

password dialog

タイプ入力し、そのパスワードが正しいことを参照してください。

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

にパスワードの内容をクリアするため、コードには、この時点で今 (私はパスワードで入力を削除し、最終的な結果は、この削除せずに/と同じである)

、私はそこにある期待しかし、メモリ内に残っているバガブーはありません。 私はクリアテキストで「バガブーを」メモリ内容を検討し、まだ見にhttp://www.sweetscape.com/010editor/を使用 bugaboo

結論:この理由はJPasswordFieldのが内部PlainDocumentを使用することであり、ごみキー入力されたものの全体の歴史を持つ、あなたの記憶したがって、メモリ内のクリアテキストを完全にクリアすることはできません。

したがって、getPassword()をchar []として使用して後でクリアするための努力はあまり効果がありません。

私に教えてください。

+0

それはどこか* nu *に保存する必要がありますか? – EJP

+1

@EJPポイントは、 'PlainDocument'を確実にクリアすることができないということです。したがって、この質問に対する答えは「はい」です。 (FWIW IIRCの場合、 'ActionListener'を追加すると' String'も取得されます) –

+0

@ TomHawtin-tacklineポイントは* 'secure'が 'パスワードをメモリに持たない'達成可能なことは、より明白な 'String'ベースの悪用を避けるために、' char [] 'ベースのAPIを提供することです。 – EJP

答えて

0

JPasswordFieldからパスワードを取得すると、コピーが取得されます。 JPasswordFieldDocumentオブジェクトには、引き続きパスワードを含む独自の文字配列があります。私はこれがあなたのメモリビューアで見られる価値だと思います。

今アイデアは1がパスワードを検証した後JPasswordFieldをクリアするには、次のようになります。

passwordField.setText(""); 

皮肉なことに、これはStringオブジェクトとしてパスワードを保存するjavax.swing.text.GapContent$RemoveUndoオブジェクト含むUndoableEditEvent提起する - 私たちは避けるようにしようとした何かを最初は