読者です 読者をやめる 読者になる 読者になる

System.Security.SecureString

.NET

arton さんのところのこれを読んで思い出しました.

まじめにパスワード入力を扱う場合って、入力されたStringの内容をクリアしておく必要があると思うんだけど、というのは、後からヒープの中を見ることができるからだけど、kmem覗くって方法もあるわけだし、でも、Stringって明示的な破壊はできないはず。

と思って調べたらJPasswordFieldを使えば良いのか。というか、JPasswordField専用のJOptionPaneは無いのか。厄介だな。

Windows でも "\Device\PhysicalMemory" にアクセスされたらどうしようもないというのは置いておいて *1,Windows 界隈だと例えば以下のような方法でメモリ上のパスワードを暗号化といった事例がちらほら.

んで,暗号化したからといって,"\Device\PhysicalMemory" 経由で復号ロジック見られたらとか*2,メッセージフックで DLL を送り込まれたらとか*3考えると,個人的にはいまいち有効性が理解できなかったのですが,どこかの記事で「HDD 上のページファイルにやばげな生文字列がページアウトされる可能性を減らす」と書かれていてなるほどなと.と思ったら,上に挙げたページのコメントのところにも 書いてあった.同コメントによると Microsoft に送られる Crash Dump に恥ずかしい生文字列が残さずにすむのも良いよ,とのこと.
んで,JOptionPane 相当 の代物についてはまだまだ微妙な模様.「biac の それさえもおそらくは幸せな日々」の『Windows フォームで SecureString を使う』にて言及されています.

*1:この抜け穴も [http://technet2.microsoft.com/WindowsServer/ja/Library/e0f862a3-cf16-4a48-bea5-f2004d12ce351041.mspx?mfr=true:title=塞がれちゃって] 最近は色々不自由になりましたが

*2:これが可能なら何でもできるのでいちいちパスワードごとき気にしても仕方がないですが

*3:Vista 以降はある程度防げるようになりましたが