36

getPassword文字の配列を返すメソッドを使用しただけで、そのgetTextメソッドが非推奨であることがわかりました。しかし、今思うと、なぜこのメソッドは廃止されたのでしょうか?.

Java ドキュメントでは次のように説明されています。

非推奨Java 2 プラットフォーム v1.2 以降、 に置き換えられましたgetPassword

コンポーネントによって表されるテキストの一部を取得します。長さが 0 の場合、空の文字列を返します。

セキュリティ上の理由から、このメソッドは非推奨です。getPassword代わりにメソッドを使用してください。

しかし、それらのセキュリティ上の理由は何ですか? これについてのアイデアはありますか?

前もって感謝します。

4

5 に答える 5

56

呼び出すgetTextと、(リフレクションを除いて)変更できない文字列(不変オブジェクト)を取得するため、パスワードはガベージコレクションされるまでメモリに残ります。

呼び出すgetPasswordと、変更される可能性のある char 配列が取得されるため、パスワードは実際にはメモリに残りません。

于 2012-05-04T05:52:50.647 に答える
27

これを試して :

String myPass=String.valueOf(passwordField.getPassword());
于 2015-07-02T22:01:27.733 に答える
9

この理由は、パスワードを文字配列ではなく文字列として要求すると、パスワードを含むこの文字列が Java ランタイムのメモリ内で不特定の時間浮遊するためです。そこから不正な Java コンポーネントまたは外部プログラムによって読み取られる可能性があります。

代わりに char 配列を使用すると、パスワードを確認してすぐにスクランブルできます。

于 2012-05-04T05:53:17.007 に答える
5

この動作の背後にある理由は、Java文字列プールです(詳細については、このSOの質問などを参照してください)。そのパスワードフィールドの内容を(メソッドStringを使用した場合に発生する)に変換するとすぐに、はプールに配置され、他のユーザーが読み取ることができます。getTextString

メソッドの実装を見ると(質問へのコメントとして投稿されたSOの質問@GarbagegetPasswordに見られるように)、これが。の作成を慎重に回避していることがわかります。String

これは、次のようなことをしてはいけないことも意味することに注意してください

if ( Arrays.equals( "mySuperSecretPassword".toCharArray(), passwordField.getPassword() ) )

または、パスワードをプールに入れてしまう場合でも、このgetText方法を簡単に使用できます。

于 2012-05-04T06:16:13.677 に答える
0
  • getText () は文字列を返すため、文字列が (標準の Java 動作として) 文字列のプールに追加されます。ストリングのプールはガベージ コレクターによってクリーンアップされますが、それが動作する場合のみです (オンデマンドではありません)。したがって、パスワードは不要な場合でもプールに残る可能性があり、他の Java プロセスによって読み取られる可能性があります。

  • getPassword () は文字の配列を返します。これらは文字列ではなく配列オブジェクトであるため、ガベージ コレクターが必要とするときにも削除されますが、プールには残らず、他の Java プロセスからはアクセスできません。

しかし、getPassword () によって読み取られた char の配列の使用方法には注意が必要です。これを文字列に変換すると、プールに送られ、 getText () を使用した場合と同じくらい悪い結果になるためです。 ..

于 2021-08-09T09:27:39.050 に答える