最近、仕事で同僚の何人かと議論しました。彼らは、.DLLに暗号化された文字列接続がある方が良いと言ったからです。そして、web.configで暗号化された文字列接続を暗号化しないのはなぜだと言いましたか?エンティティフレームワークは、たとえば、アプリケーションのWeb構成で接続の名前を検索するため、同じであり、より優れています。セキュリティポイントから、何がベストか、何がベストプラクティスかを知りたいですか?
最近、仕事で同僚の何人かと議論しました。彼らは、.DLLに暗号化された文字列接続がある方が良いと言ったからです。そして、web.configで暗号化された文字列接続を暗号化しないのはなぜだと言いましたか?エンティティフレームワークは、たとえば、アプリケーションのWeb構成で接続の名前を検索するため、同じであり、より優れています。セキュリティポイントから、何がベストか、何がベストプラクティスかを知りたいですか?
回答:
実質的な違いはありません。ただし、DLLに配置する場合、構成を変更する場合は実際にバイナリをビルドする必要がありますが、管理者はよく知られた市販のツールで構成を変更できます。 configにある場合。MSDNには、構成文字列を暗号化するためのメカニズムと追加のガイダンスが既にあります。Asp.Netの現在のバージョンには代替のメカニズムがある場合があるため、アプローチに取り組む前に追加の調査を行ってください。
何かがDLLに含まれているからといって、それをそれ以上安全にすることはできません。テキストエディタでもバイナリファイルを開くことができます。Reflectorなどのツールは、.Net DLLをナビゲートするための優れたインターフェイスを提供できます。DLLは「余分な」暗号化を提供しません。
暗号化されたデータがどこに保存されているかは問題ではなく、どのように暗号化されているかが重要です。
web.configの暗号化されたセクションは、通常Data Protection APIで暗号化されます。これは、マシン全体を危険にさらすことなくクラックすることは非常に困難です。RSAキーコンテナを使用することもできますが、これは同様です(マシンからこれらを取得するのは困難です)。
暗号化された文字列をDLLに保存したい場合、それは問題ありませんが、本質的には暗号化されたweb.config(誰もがReflectorを使用してそのDLLを覗くことができます)よりも安全ではなく、明らかに変更するのが難しいです(あなたは再コンパイルする必要があります)。しかし、繰り返しますが、もっと重要なのは、暗号化された文字列がどのように生成されたかです。おそらく、暗号化されたweb.configの場合と同じプロバイダーを使用していないので、何を使用していますか?
暗号化スキームは、秘密鍵または共有秘密と同程度にのみ強力です。そのキーがアセンブリにも格納されている場合、暗号化がまったくない場合もあります。外部データベースに保存されている場合、そのデータベースの接続文字列がどのようにセキュリティで保護されているかという問題が発生します。これは、実際には全体的なセキュリティの低下につながる可能性があります。
あなたは、サービスプロバイダと接続文字列を使って暗号化されたした一方、ユーザーのパスワードを、そのようになり、より静的なマシンキーを使用してより安全な。繰り返しますが、ユーザーパスワードを使用して暗号化する場合、ユーザー(開発者ではない)アクションに応じて生成および保存する必要があるため、アセンブリ内の暗号化されたデータをハードコーディングすることはほとんどありません。
DLL内の(暗号化された)接続文字列をハードコーディングすることが、関連するweb.configセクションを暗号化するよりも安全であるという状況はあまり考えられません。せいぜい、それは単に不便さを追加するだけで、最悪の場合、それはいくつかの不格好に書かれた穴に満ちたカスタムセキュリティに依存しています。あなた自身を支持し、マイクロソフトが推奨することをしてください-機密データがそこにある場合は、web.configを暗号化してください。
ASP.NETのベストプラクティスは、すべての構成/設定をweb.configファイルまたはapp.configファイルに配置することです(他のプロジェクトタイプの場合)。
暗号化と接続文字列で暗号化を使用する理由については、非常に特殊なケースである必要があります。ほとんどの場合最大99%であるため、接続文字列を暗号化する必要はありません。マイクロソフト独自のエンタープライズアプリケーションの接続文字列は、web.config / app.configファイルで公開されています。セキュリティが複雑になっていると思います。
もう1つ、接続文字列をハードコーディングするのは悪い習慣です。たとえば、DLLまたは.aspx / .ascx / .cshtmlまたは分離コードに接続文字列(接続文字列とも呼ばれる)を入れないでください。