System.Security.SecureString
arton さんのところのこれを読んで思い出しました.
まじめにパスワード入力を扱う場合って、入力されたStringの内容をクリアしておく必要があると思うんだけど、というのは、後からヒープの中を見ることができるからだけど、kmem覗くって方法もあるわけだし、でも、Stringって明示的な破壊はできないはず。
と思って調べたらJPasswordFieldを使えば良いのか。というか、JPasswordField専用のJOptionPaneは無いのか。厄介だな。
Windows でも "\Device\PhysicalMemory" にアクセスされたらどうしようもないというのは置いておいて *1,Windows 界隈だと例えば以下のような方法でメモリ上のパスワードを暗号化といった事例がちらほら.
- MSDN Library - CryptProtectMemory
- MSDN Library - SecureString クラス
- .Net Security Blog - SecureString Redux
んで,暗号化したからといって,"\Device\PhysicalMemory" 経由で復号ロジック見られたらとか*2,メッセージフックで DLL を送り込まれたらとか*3考えると,個人的にはいまいち有効性が理解できなかったのですが,どこかの記事で「HDD 上のページファイルにやばげな生文字列がページアウトされる可能性を減らす」と書かれていてなるほどなと.と思ったら,上に挙げたページのコメントのところにも 書いてあった.同コメントによると Microsoft に送られる Crash Dump に恥ずかしい生文字列が残さずにすむのも良いよ,とのこと.
んで,JOptionPane 相当 の代物についてはまだまだ微妙な模様.「biac の それさえもおそらくは幸せな日々」の『Windows フォームで SecureString を使う』にて言及されています.