5

Java 1.2以降、JPasswordField.getText()「セキュリティ上の理由」で非推奨になり、「getPassword()より強力なセキュリティのために」メソッドの使用を奨励しています。

ただし、JPasswordFieldヒープダンプ()を分析することで、少なくともOracleJRE1.7に格納されているパスワードを取得できましたJPasswordField instance -> model -> s -> array

では、パスワードを保護するのにどのようにJPasswordField.getPassword()役立ちますか?

4

3 に答える 3

3

まあ、それのためのドキュメントは述べています:

セキュリティを強化するために、使用後に各文字をゼロに設定して、返された文字配列をクリアすることをお勧めします。

ただし、もちろん、このgetTextメソッドを使用すると、不変の文字列が返されるため、同じ推奨を実行することはできません。

于 2012-01-06T11:42:31.350 に答える
2

答えは簡単です。と の違いを説明する実用的なアプローチを次に示しますgetPassword()getText()

JPasswordField jt=new JPasswordField("I am a password");
System.out.println("The text is "+jt.getText());
System.out.println("The password is "+jt.getPassword());

出力

I am a password
[C@1e4a47e

getPassword()メソッドはパスワードを as として返しchar[]ますgetText()が、 はパスワードをプレーン テキストとして、つまり の形式で返しますString

ただし、このように印刷すると、

System.out.println(new String(jt.getPassword()));

getText()これはinとほぼ同じJPasswordFieldです。getPassword()ただし、これは を内部的に使用してから配列getText()に変換するという意味ではありません。char

このgetPassword()メソッドは、非文字列 API、つまりSegment. ただし、Segmentこれも不変ですが、getPassword()メソッドは から char 配列を取得してSegment返します。

ただし、 aStringは不変で不変でchar[]あるため、消去できるため、 achar[]は非常に安全であると見なされます。

于 2013-07-17T15:47:11.933 に答える
1

getPassword()は内部でgetText()を使用しますが、セキュリティ上の注意

JPasswordFieldクラスはgetTextメソッドを継承しますが、代わりにgetPasswordメソッドを使用する必要があります。getTextの安全性が低下するだけでなく、将来的には、型指定された文字列の代わりに表示されている文字列(たとえば、「**」)が返される可能性があります。

セキュリティをさらに強化するには、getPasswordメソッドによって返される文字配列を使い終わったら、その各要素をゼロに設定する必要があります。

于 2012-01-06T11:44:18.777 に答える