20

重複の可能性:
パスワードに文字列よりも char[] が好まれるのはなぜですか?

準備をしていたときにOCPJP、「コンソールからのユーザー入力の読み取り」というトピックに出くわしました。

配列ではなく参照usernameで読み取る例がありましたが、なぜchar配列を使用したのか理解できませんでした。コードは次のとおりです。Stringpasswordchar[]

Console console = System.console();

String username = console.readLine("User Name? ");
char[] password = console.readPassword("Password? "); 

これは私の心に疑問を投げかけました..パスワードを保存するために文字列参照を使用しなかったのはなぜですか。Strings不変であるため、文字列でパスワードを読み取る方が安全である必要があります。その内容は変更できないためです。

passwordそれで、配列で読むことの全体的なポイントは何char[]ですか..

誰かがこの問題に光を当てることができますか?

4

4 に答える 4

11

あなたが言ったように、文字列は不変です。つまり、文字列を作成したら、別のプロセスがメモリをダンプできる場合、GC が開始される前にデータを削除する方法はありません (リフレクションが発生する可能性があります)。

配列を使用すると、データを使い終わった後にデータを明示的に消去できます。配列を好きなもので上書きすることができ、ガベージ コレクションの前であっても、パスワードはシステムのどこにも存在しません。

于 2012-10-02T13:11:28.607 に答える
6

java.io.Consoleの Javadoc から:

セキュリティ上の注意: アプリケーションがパスワードまたはその他の安全なデータを読み取る必要がある場合は、メモリ内の機密データの寿命を最小限に抑えるために、処理後に返された文字配列を使用するreadPassword()か、手動でゼロにする必要があります。readPassword(String, Object...)

これは、他のアプリケーション (キーロガーなど) がパスワードにアクセスできないようにするためです。

さらに、 を使用するStringと、これらは不変であるため、変更するとメモリ内にコピーが作成されます。char[]この場合、を使用すると節約できます。これらは可変であるため、コピーを作成せず、処理後に null にすることができます。

于 2012-10-02T13:12:20.493 に答える
5

不要になったときに上書きして記憶から消去できるようにするためだと思います。少なくとも Java では、String を使用すると、メモリ内にコピーが残る可能性があります。

for ループを使用して char 配列を上書きし、各値を 0 に設定すると、メモリにコピーが残ることはないと思います。

于 2012-10-02T13:11:35.507 に答える
4

文字列は不変であるため、上書きすることはできず、アプリケーションがアクティブな間はメモリに残ります。char一方、アレイはすべてのパスワード情報をクリアできます。

于 2012-10-02T13:11:00.867 に答える