アプリケーションのメモリにパスワードを保存するのは危険です。 OSは、メモリの一部をスワップファイルとしてディスクに書き込む場合があります。プロセスはアクセスできないはずなのに、お互いのメモリにアクセスする可能性があります。 (その他)
Java=を使用して確定的なパスワードジェネレータを開発しています。メモリ内のマスターキーを処理するための最良の方法は何でしょうか。アプリケーションが「覚えておく必要がある期間もあるでしょう。 "マスターキーをメモリに上書きする前に、メモリ内のマスターキーを暗号化し、ランダムに生成された復号化キーをディスクに書き込むことを検討しました。マスターキーが不要になると、アプリは両方のファイルを上書きしようとしますこのアプローチは、後で誰かが古いスワップファイルを発見することに対してある程度のセキュリティを提供します。それは理にかなっていますか?他に何かすべきですか?
メモリ内のパスワードと暗号化キーのデータの有効期間を短縮するための良い方法は何ですか?
Javaでは、 推奨 そのchar[]
は、String
オブジェクトの代わりに機密データに使用されます。これにより、データを使い終わったときに上書きすることができます。これは、不変のStringオブジェクトでは不可能なことです。
メモリ内のパスワードと暗号化キーのデータ有効期間を短縮するための良い方法は何ですか?
スワップファイル/パーティションを暗号化します。そうすれば、スワップからパスワードが漏洩することを心配する必要はありません。
プログラムを作成する場合は、メモリの特定の部分がページアウトされないようにするシステム機能も使用する必要があります。LinuxではMAP_LOCKEDでmlock()またはmmap()を使用し、WindowsではVirtualLock()を使用します。
最近の多くのLinuxシステムは、rootであるかptrace権限がない限り、他のプロセスがトレースプロセスの子プロセスでない限り(ptrace_scope = 1)、同じユーザーの他のプロセスに直接読み書きできないように構成されています。より優れたセキュリティが必要な場合は、ptraceの子がルートまたはCAP_SYS_PTRACE機能を持つプロセス(ptrace_scope = 2)によってのみ可能になるように、またはptraceを完全に無効にするように(ptrace_scope = 3)構成することもできます。 Windowsでは、この権限はSE_DEBUG_PRIVILEGEと呼ばれます。
Javaのような高レベルのクロスプラットフォーム言語で作業している場合のベストプラクティスは、キー管理をgpg-agentやssh-agentなどの別のプロセスに任せることです。またはハードウェアセキュリティモジュールに任せることです。 、別のハードウェアでキー管理、認証、または暗号化/復号化を実行します。別のオプションは、多くの最新のシステムがTPMをサポートしている場合があり、本質的に組み込みのHSMを提供します。
パスワード文字列をもう少し安全に保つためにGuardedString
を使用できます。これは、パスワードが文字列で表されるメモリに保持される問題に対処するために作成された特別な文字列オブジェクトです。
パッケージ org.identityconnectors.common.security.GuardedString バージョン0.2.3。 GuardedStringクラスファイルドキュメントの引用:
パスワードをJava.lang.Stringとして保持することに関連する問題を解決する安全な文字列実装。つまり、文字列として表されるものはすべてクリアテキストのパスワードとしてメモリに保持され、少なくともガベージコレクションが行われるまでメモリに保持されます。 GuardedStringクラスは、暗号化された形式で文字をメモリに格納することにより、この問題を軽減します。暗号化キーはランダムに生成されたキーになります。シリアル化された形式では、GuardedStringは既知のデフォルトキーを使用して暗号化されます。これは、トランスポートに関係なく、最低レベルの保護を提供するためです。リモートコネクタフレームワークとの通信では、展開でSSLを有効にして真の暗号化を行うことをお勧めします。アプリケーションは、GuardedStringsを永続化したい場合もあります。 Identity Managerの場合は、GuardedStringをEncryptedDataに変換して、Identity Managerの暗号化の管理機能を使用して保存および管理できるようにする必要があります。他のアプリケーションは、全体としてAPIConfigurationをシリアル化したいと思うかもしれません。これらのアプリケーションは、(GuardedStringによって提供される基本的なデフォルトのキー暗号化を超える)セキュリティの追加レイヤーのためにAPIConfiguration Blobを暗号化する責任があります。