3

これに関するさまざまな解決策について読み込もうとしましたが、進むべき道は個々のシナリオに大きく依存することを理解しています. これは良いリンクでした: http://msdn.microsoft.com/en-us/magazine/cc164054.aspx

この特定のシナリオに関する専門家のアドバイスをいただければ幸いです。

シナリオ:

ローカル管理者権限を持つクライアントに配布される SQL コンパクト データベースを含む WPF アプリケーション。アプリケーションは、常にインターネット接続に依存することはできません。アプリケーション自体がデータベースにアクセスできる必要があることを除いて、なし。では、これに対する最善のシナリオ、または最悪でないシナリオは何でしょうか? ユーザーがデータベースの資格情報を取得できないようにするためです。

編集:データベースはエンジンのデフォルトで暗号化されており、強力なパスワードが設定されています。

オプション:

  • 保護された構成を使用した構成ファイル セクションの暗号化 ( http://msdn.microsoft.com/en-us/library/89211k9b(v=vs.80).aspx )
    • DPAPIProtectedConfigurationProvider を使用 (クライアント キーを使用):
      • 長所: 鍵を手に入れるのが難しくなります...?? または、ユーザーがローカル管理者権限を持っている場合ではないかもしれません..?
      • 短所: 接続文字列は、暗号化されたコンピューターでのみ復号化できます。クライアント マシンで暗号化する必要があります。アプリケーションを初めて実行するとき、または MSI を使用してインストールするときにカスタム アクションを使用するとき。どちらも、実行する前に確認する必要があることがわかっている場合、接続文字列を簡単に取得できます。
    • RSAProtectedConfigurationProvider を使用 (提供されたキーを使用):
      • 長所: 配布時にデータが暗号化される
      • 短所: キーをどこかに保管する必要があり、侵害されやすくなります..?? ユーザーがローカル管理者権限を持っている限り、おそらく DPAPIProtectedConfigurationProvider との違いはありません..?
  • Windows セキュリティの使用:
    • 短所: ユーザーは、独自の資格情報を使用してデータベースに簡単に接続できます。したがって、これはオプションではありません。
  • データ隠蔽:
    • 短所: 例によってリバース エンジニアリングを行うときに、接続文字列を簡単に取得できます。これはスタンドアロンのオプションではありません。
  • その他のオプション?

DPAPIProtectedConfigurationProvider を使用し、app.config の最初の実行時またはインストール時のカスタム アクションで接続文字列を暗号化することが提案されている多くの例を目にします。

まあ、最悪ではないオプションは、RSAProtectedConfigurationProvider を使用して、毎回生成されるカスタム RSA キーを使用して app.config を暗号化することだと思います (キーを毎回同じにするロジックを使用)。次に、このコードはすべて難読化されます。このようにして、暗号化された接続文字列を使用して app.config を配布できます。

資格情報は依然として危険にさらされる可能性があり、このシナリオでこれを 100% 回避する方法がないことはわかっています。最悪の選択肢を選ばないことがすべてです。

今、私はあなたの意見をいただければ幸いです...ありがとう!

4

1 に答える 1

3

その通りです。特定のローカル管理者がこのデータベースにアクセスするのを防ぐことはできません。

これが私が -- 決定的なユーザーとして -- 行うことです (過去に他のプログラムで実行したことがあります): 実行中のプロセスにデバッガーを接続し、メモリを調べてプレーンな接続文字列を見つけます (もちろん、私は単純化していますが、動作します)。

もう 1 つのオプションは、デバッガーを使用して IDbCommand オブジェクトをハイジャックし、任意の SQL コードを実行することです。接続資格情報を見つける必要はありません。アプリケーションが接続を管理します。

つまり、ユーザーはどれだけ有能で決断力があるかということになります。あなたのデータベースはどのくらい重要ですか? あなたはどのくらい決心していますか?これは古典的なハッカーのトレードオフです。ユーザーがアプリをクラッキングするのを思いとどまらせるために、どれだけの労力を費やしたいと思いますか?

私がする最低限のこと:

  1. 生の接続文字列を暗号化します。この部分をカバーしました。

  2. 組み込みの app.config セクションの暗号化に頼るのではなく、コードで暗号化を行うこともできます。組み込みのものの問題は、それが自己文書化することです。.net の知識がある人は、それがどのように暗号化されているかを読むだけでわかります。キーを保護することでセキュリティが確保されますが、ローカル管理者からキーを隠すことはできません。セクションを復号化するためのコマンドライン ツールもあります (正しいキーを渡す場合)。コードで復号化を実行すると、使用しているアルゴリズムがわかりにくくなり、実際に復号化するにはより多くの作業が必要になります。注: 言及したような強力な暗号化プロバイダーを引き続き使用する必要があります。隠蔽するのではなく、独自の暗号化暗号を発明する必要があると言っているのではありませ構成ファイルではなく、プログラム自体で使用する暗号。

  3. コンパイルされたアセンブリを難読化します。それ以外の場合は、IlSpy などのツールで簡単に開き、変更することもできます (プレーンな接続文字列をダンプするなど)。

  4. デバッガー トラップをいくつか追加して、デバッガーがプロセスに接続されないようにします。

3. と 4. はどちらも、混合モード アセンブリ (ネイティブ コードとマネージド コードを含むアセンブリ) を使用するとより効率的であることに注意してください。

これが始まりです。たぶん、他の人はもっと多くのアイデアを持っているでしょう。


もちろん、これはアプリケーション側だけでした。組み込みデータベースも適切に保護する必要があります。最初から暗号化する必要があります。

于 2013-06-02T22:38:29.733 に答える