Java証明書ストアと公開鍵/秘密鍵を格納するキーストアです。このキーストアはパスワードで保護されます。ただし、キーストアへのアクセスはプログラムからのみです。 APIアクセスのみに基づいているため、入力を提供する方法はありません。
Javaキーストアのパスワードを保存するのに最適な場所と、それをどの形式で保存する必要がありますか?
プログラムを実行する人の手に秘密鍵を持たせたくない場合は、機能しません。コードに埋め込まれた秘密は抵抗しません リバースエンジニアリング (特に、リバースエンジニアリングが非常に簡単なJavaを使用する場合)。
状況については詳しく説明しませんが( "Java"と "プログラム"とだけ言う)、次の一般的なアドバイスを提供できます:秘密キーをユーザー固有のものにして、ユーザーの秘密鍵が非公開のままであることが最も重要です。その場合、ユーザーは主要なセキュリティに協力します。次に、秘密キー(または秘密キーをロック解除するパスワード)を Javaプリファレンス に保存します。
これは本当に良い質問です。もっと良い答えを見つけたいです。ここに私が知っているものがあります:
これらのうち、最初のものが最も一般的で、多くの場合、パスワードは「password」または「changeit」などです。2番目のオプションは、一見するとより良く見えるかもしれませんが、正確に説明するのは困難です。最後のオプションは、おそらく意味のあることを何でもすることを期待している唯一のオプションです。この種のことを行い、セキュリティを向上させると主張するベンダーソリューションを知っています。
ここでの根本的な問題は、攻撃者がホスト上にいて、アプリケーションスペースを表示するのに十分なアクセス権がある場合、このパスワードを入手できないようにする方法はないということです。ある時点で、それは平文でメモリになければなりません。
私が見るように、キーストアのパスワードは、キーストア自体が実際にそのマシンに直接アクセスすることなくマシンから取得された状況で主にそれを保護します。そのファイルを使用すると、攻撃者は自由にそれをハンマーで操作して秘密を漏らすことができます。強力なパスワードがなければ、ゲームオーバーです。攻撃者がそのファイルをプルできる場合、パスワードが格納されている可能性のある他のファイルをプルできる可能性があります。これにより、オプション1と2が疑わしくなります。
3番目のオプションに関する限り、問題は、パスワードを取得するためにクライアントを認証する方法に移ります。ホスト/ネットワークに依存したり、バイナリで署名を使用したりするなど、これを行うためのスキームがいくつかあることを知っています。これを行う方法とそれがもたらす保護のレベルについての完全な議論を持つことができます。
私はJavaアプリケーションを完成させようとしています。アプリケーション全体がVMイメージ製品として展開されますMicrosoft Azureクラウドで購入できます。
私の状況では、顧客が自分の選択したドメイン名で製品のWebサーバーを実行できるようにしたいと考えています。これには、顧客がドメイン名と関連するキーを取得するプロセスを実行する必要があります。これらのキーは、VM Webサーバーが実行される場所にあるキー/トラストストアにインストールされます。このアプリケーションでは、ユーザーはキーストアとトラストストアのファイルパスとパスワードを3つの異なる方法で指定できます:
ユーザーがコマンドウィンドウをスクロールバックしないことに慣れている場合は、オプション#1を使用できます。
サーバー上のプロパティファイルにこれらの詳細を配置することに慣れている場合は、オプション#2を使用できます。
オプション3を使用すると、パスワードがディスクに保存されず、コマンドウィンドウから回復できないことが保証されます。ただし、サーバーを再起動するにはユーザーが立ち会う必要があることも意味します。