web-dev-qa-db-ja.com

パスワードをJava)に安全に保存するためのベストプラクティスは何ですか

Javaデスクトップアプリケーションにパスワードを保存するための推奨される方法は何ですか?

ユーザーが資格情報を1回だけ入力し、再度プロンプトが表示されないようにする必要があります。

個人的なプロジェクトでは、Preferences APIを使用していますが、これはプレーンテキストで保存するのと同じだと思います(セキュリティ面で)。

どうもありがとう

編集:

あなたの提案に感謝します。質問をあまり明確にしなかったかもしれないので、間違いなく、いくつかの混乱があるようです...

架空のシナリオを示します。

ユーザー名/パスワードで接続文字列を作成するリモートデータベースの単純なフロントエンドを作成しているとします。通常、ユーザーは、アプリケーションが起動するたびに、ユーザー名とパスワードの組み合わせを入力するように求められます。

パスワードを再入力せずに(アプリケーションの起動時に自動的に接続する)、そのパスワードをユーザーのマシンに保存するための最良の方法は何でしょうか。

一種の「rememberme」機能(それ自体はあまり良い習慣ではないことを私は知っています...)

EDIT2:

みなさん、ありがとうございました。 PaŭloEbermann'sは目前の問題について非常に有益であり、Chris Smithのリンクは興味深いものでしたが、キーストアが私が取っているルートである可能性があるため、JVerstryのリンクを受け入れました。

24
Rui Vieira

秘密鍵の代わりにパスワードを入力できるローカルキーストアを使用できます。

編集するための回答:

キーストアは、ニーズに最適です。追加の保護が必要な場合は、ユーザーがアプリケーションを起動したときに、すべてのパスワードにアクセスするために1つのパスワードをユーザーに要求できます。次に、アプリケーションの起動時に使用された1つのパスワードを使用して、(暗号化キーを生成するための)単純なソルトアンドストレッチ方式で保存されたデータベースパスワードを保護できます。

10

Javaプログラムが(ユーザーがパスワードを入力せずに)それを取得できるようにコンピューターに何かを保存する方法はありませんが、他のプログラム(同じユーザーのアカウントで実行されている)はありませんこのコンピュータでそれを取得することができます。

なんらかの方法で暗号化して、プログラムの復号化キーと一緒に復号化アルゴリズムを非表示にすることができます(ホワイトボックス暗号化)が、攻撃者はデバッガーでプログラムを実行してデータを復号化する必要があります。

システムの許可システムを使用することもできますが、攻撃者がJavaプログラムと同じユーザーアカウントで実行されているプログラムである場合、これは通常役に立ちません(攻撃者がルートを持っている場合はさらに役立ちません)アクセス)。

最善の策は、パスワードをUSBメモリに保存し、使い終わったらパスワードを取り出すようにユーザーに指示することですが、攻撃プログラムが実行されていて、スティックから秘密を読んでいる間に監視している場合は、これでも助けません。

4
Paŭlo Ebermann