2009-05-21 16 views
19

私が知りたいのは、設定ファイルの接続文字列を暗号化する明確なアプローチです。ここに私の質問は以下のとおりです。マシンレベルの暗号化を使用して.Net暗号化

  1. 、私のサーバーにアクセスする誰もが接続文字列の内容を読み取るために少しの.Netプログラムを書き込むことはできませんか?

  2. エンタープライズ環境のユーザーマシンにアプリケーションをデプロイする場合、アプリケーションに構成ファイル内の接続文字列がある場合、アプリケーションでのみそのファイルを復号化できることを確認するにはどうすればよいですか?このシナリオは、ClickOnceの展開シナリオで特に興味深いものです。私は、パブリッシャーサーバーで暗号化されていない設定を保存し、アプリがダウンロードされ、インストールされ、初めて実行されたときにマシンレベルで暗号化する人について読んできました。これは私には間違って聞こえる - 接続文字列がワイヤで保護されず、ダウンロードとアプリケーションの実行の間に短時間の間保護されていない状態になります。

  3. 私は公開鍵と秘密鍵を持ち、自分のアプリケーションに署名し、設定ファイルを鍵で暗号化できますか?ユーザーがそれを実行すると、署名されたアプリケーションからのみ復号化が可能ですか?

  4. 私はClickOnceを使用しているので、バージョン番号が変更されない限り、ClickOnceは変更を検出しないため、暗号化された機密情報をコードに埋め込むことができます。したがって、接続文字列を変更すると再コンパイルする必要がある場合、app.configのポイントはミュートされます。サーバー、クライアント、およびその間の接続文字列の保護を実現するために、設定ファイルを使用して外部からどのようなアプローチを取ることができますか?

+0

あなたの第1の質問をより深く記述できますか? 「マシンレベル」の暗号化とは何ですか? – nightcoder

+0

あなたが知っている限り、あなたは組み込みの暗号化を使ってマシンレベルとユーザーレベルで暗号化することができます。例えば、configSection.SectionInformation.ProtectSection( "RSAProtectedConfigurationProvider")を用いて、 またはAspnet_regiis.exeに –

+1

を通しておそらくそれはよりも昨日(http://stackoverflow.com/questions/890396/click-once-how-to-encrypt-connection-strings)尋ねたあなたの前の質問に詳しく説明する方が理にかなって異なった言葉で二重の質問を作成する。 – Pwninstein

答えて

13
  1. はい。マシンキーで暗号化された秘密は、マシンキーにアクセスできる任意のプロセスによって復号化できます。ユーザーキーで暗号化された秘密は、同じユーザーによって開始されたプロセスによって復号化できます。
  2. これはできません。すべての反対の主張はヘビ油です。アプリケーションでは、何かを解読するために秘密が必要です。アプリケーション内の秘密を隠すための既知のスキームはありません。さまざまな難読化スキームがありますが、防弾はありません。あなたができることはバーを上げることです。
  3. いいえアプリケーションに何かを復号化するための秘密鍵がある場合は、ポイント2に戻るか、アプリケーションに公開鍵がある場合は誰でも同じ秘密を復号化できるため、基本的に検証を行います(改ざんされていない)が、設定は秘密ではありません。
  4. アプリケーションに安全に組み込みの秘密を展開することはできません。あなたの保護された資産(秘密)が価値があるならば、価格はどれくらい高いのかだけの問題です、そして、ハッカーがそれを得るでしょう。

暗号化インフラストラクチャは、現在のユーザーの秘密を他のユーザーから保護するように設計されています。アプリケーションを使用するユーザーからアプリケーションの秘密を保護するようには設計されていません。あなたが求めているのは暗号化ではなく、DRMであり、答えのためにDRMインフラストラクチャを調べる必要があります。私はDRM APIの周りの管理ライブラリを知らない。

+0

ありがとうございます。私はあなたの助けに感謝します。 –

3

いい質問実際、

あなたは誰もがあなたの接続文字列(またはパスワード)を復​​号化します確認することはできません。もちろん、あなたはそれを暗号化することができますが、あなたのアプリケーションを逆コンパイルして、どの暗号化アルゴリズムを使用し、どの文字列を使用して接続文字列/パスワードを復号化できるかを見ることができます。多分それは極端なシナリオのようですが、それは可能です(私は学生時代に悪のクラッカーでした:))。したがって、このようなシナリオを恐れている場合は、アプリケーションを保護する必要があります。逆アセンブルするのが難しくなります。これは別の議論のテーマですが、例えばDotfuscatorやその他の良い難読化ツールを使うことができます。クラッカーがアプリケーション内で何が起こっているのかを理解するのが難しくなります。
したがって、1つの解決策は "接続文字列を暗号化+難読化する"ことができますが、私が言ったように、それはあなたに100%の保護を与えません。

2

対称暗号化を使って秘密を格納することは、パスワードを宣伝したり、秘密の暗号化を解読する(特殊なハードウェアなど)必要がない限り、常に問題になります。完全なキーをシステムのどこにでも保存する必要がある場合、他の人がキーを取得する方法があります。

私は間違いなくオペレーティングシステムのメカニズムを使用しようとします。純粋なWindows環境でMS-SQLを使用する場合は、user/passwordの代わりに統合セキュリティを使用する必要があります。他のデータベースも同様の機能を持つ可能性があります。
もう1つ(弱い)オプションは、オペレーティングシステムのセキュリティ設定でクリアテキストファイルを保護することです。ユーザーだけがファイルにアクセスできます。しかし、あなたとあなたのユーザーは管理者を信頼する必要があります。この場合は、さらに対称暗号化を使用する必要があります。しかし、私の最初の議論を参照してください - それは本当に安全ではありません。

0

Gustavoこれを実装することができます(これは私のアプリケーションのログインベースの計画です)。

ユーザーは.Netアプリで認証情報を入力します。資格情報は、データベースにログインしてキーを取得して.Netアプリに戻すために使用する.phpサーバー側のアプリケーションに渡されます。このキーは、.Netアプリのハードコードされた暗号化された接続文字列で使用され、完全なデータベースアクセスを可能にします。

関連する問題