質問: .NETアプリケーションにおいて、アプリケーションで使用する必要があるが利用者に見せられない情報の管理方法について悩んでいます。 例えば DB の接続情報は、アプリケーションには必要ですが利用者には見せたくありません。 暗号化すれば良いとは思いますが、そうなると今度は鍵をどこに保存するのかという問題になります。 何か定石やうまい方法はないでしょうか。 以下、検討したことです。 ・鍵をアセンブリに含める → 逆アセンブルで確認できてしまうので× ・鍵をApp.config に書いて aspnet_regiis で暗号化する → aspnet_regiis を使えば復号できてしまうので× ・鍵をキーコンテナーに格納する → アプリケーションがキーコンテナーの値を使用できるということは利用者も閲覧可能なので×
回答: 不可能です。 > > 例えば DB の接続情報は、アプリケーションには必要ですが利用者には見せたくありません。 > > > 接続には`DbConnection`クラスまたはその派生クラス(例えばSQL Serverであれば`SqlConnection`クラスなど)を使うと思いますが、デバッガーをアタッチしブレークポイントを置いて`ConnectionString`プロパティを参照してしまえば、復号された接続情報を読むことができます。 DBの接続情報に限らず、いかなる暗号化もこの方法には無力です。 デバッガーのアタッチを拒否する等の特殊な対策もあるかもしれませんが、結局はイタチゴッコでしかありません。 定石という程ではありませんが、確実に秘匿したい情報・処理は別サーバーで実行し、クライアントとは入出力データのみをやり取りするしかありません。