1

これは、「プレーンテキストのユーザーのパスワードを保存しても安全ですか?」という通常の質問ではありません。いいえ、安全ではありません。

外部システムに対して認証を行って何らかの処理を行う必要がある小さなアプリケーションを作成していますが、利用可能な唯一の認証方法はユーザー名とパスワードによるものです。これは人間用であり、変更することはできません。

私のアプリケーションにアクセスできる複数のユーザーがいて、それぞれが個別に認証されていますが、それらはすべて、理想的にはアプリケーションによって透過的に管理される外部システムに対して同じ認証データを「共有」しています。

「愚かな」解決策は、ユーザー名/パスワードをプレーンテキストで保存し、それを認証に使用することですが、明らかにこれは安全ではありません。パスワードは暗号化できますが、誰かがシステムに侵入したらどうなるでしょうか?

考えられる解決策: DPAPI を使用して、パスワード (場合によってはユーザー名も) を透過的に暗号化/復号化します。これは良い考えですか?これは安全ですか?複数のマシンでのセットアップはどうですか (マシン間での暗号化の互換性はありますか)?

追加の提案はありますか?

4

3 に答える 3

2

DPAPIは通常、Webファームでは使用できません。キーストアはマシンに固有です。特定のユーザーが1つのクレデンシャルのセットを共有し、別のユーザーが別のクレデンシャルのセットを共有するかどうかを指定しませんでした。すべてのユーザーが同じクレデンシャルのセットを共有している場合は、それをweb.configに保存して、それで完了します。web.configファイルの構成暗号化APIまたは単純なACLのいずれかを使用して、資格情報を保護します。

異なるユーザーが異なるサードパーティシステムのクレデンシャルを持っている場合、ユーザーのパスワードのハッシュと暗号化キーとしてソルトを使用して、ユーザーと一緒にクレデンシャルを保存します。そうすれば、悪意のあるユーザーがデータベースを取得したとしても、サードパーティのパスワードをハッキングしようとする前に、まずユーザーのパスワードを復号化できる必要があります。塩はそうすることでさらに困難の層を追加します。

于 2009-11-03T07:00:12.863 に答える
1

プレーンテキストのユーザー名とパスワードを外部システムへのログインに使用できるようにしておく必要があります。このファイルを自分で暗号化してから、アプリケーションのキーをなんらかの形で覆い隠すことができます。

ただし、オペレーティングシステム(Windowsなど)がファイルを保護する方法を提供している可能性があり、経験豊富な専門家によって実装されている可能性があります。自分でファイルを作成するために時間を費やすことをお勧めするのは難しいです。

したがって、最善のアプローチは、資格情報をプレーンテキストとして保存し、オペレーティングシステムに依存してファイルを保護することです。

  • Webサーバーが独自のユーザーとして実行され、データを取得できるのはWebサーバーのみである暗号化されたホームディレクトリ
  • ディスク全体の暗号化

これが無人であることが意図されている場合、起動時にマシン/サービスがどのように「ログオン」するかを考慮する必要があります。

質問自体はセキュリティの免責事項でカバーされているので、この点に労力を費やす必要はありません。

  • サーバー上の端末に到達するアイドル状態のピアを排除します
  • 実行中のマシンや物理的な機器にアクセスできる専用の攻撃者を締め出すことはできません(ファイアワイヤやUSBデバイスからクーラント攻撃まで、基本的に防御することは不可能です)
  • サーバーとログインしている他のシステムの間でこれらのクレデンシャルが飛行中に攻撃されるのを防ぐことはできません-通常のhttpがhttp-digest認証さえもなしに他のシステムにログインする場合...
于 2009-11-03T07:13:54.660 に答える
1

DPAPIキーはユーザーレベルであることに注意してください。ユーザーごとにクレデンシャルセットの個別のコピーを設定して保存する場合を除いて、DPAPIは役に立ちません。これを行うための唯一の本当に安全な方法は、Windowsサービスをユーザーとして実行し、そのユーザーのHKCUハイブに保存されている保護されたデータをDPAPIキーで暗号化する「信頼できるサブシステム」モデルを使用することです。ユーザーに代わって認証を必要とするシステムに対してすべてのアクションを実行し、ユーザー名/パスワードはユーザーのプロセスにロードされません。それでも、ユーザーが管理者である場合は、サービスプロセスをデバッグすることで、技術的にはユーザー名/パスワードを取得できます。

これを行うための本当に安全な方法は、同じことを行うことですが、リモートでWindowsクレデンシャルを使用して、ユーザーに代わってアクションを実行するリモートサーバーに対してユーザーを認証します。本当に、そのユーザー名/パスワードがどれだけ安全である必要があるかに依存します。

于 2009-11-03T07:01:59.083 に答える