あなたが話していることはいくつかの理由で行うのが難しいでしょうが、主にこれは:
WinFormsアプリのコードに何かを入れると、非常に簡単に逆コンパイルできます。コードは好きなだけ難読化できますが、逆コンパイルすることもできます。
そのため、アプリにあるコードは、そのコードにアクセスできる人なら誰でも読むことができます。 WinFormsアプリは常に完全に侵害されているかのように扱い、サーバー側のセキュリティがそれを補うようにする必要があります。
このため、ユーザー名とパスワードを構成ファイルまたはコードに単純に保存することはできません。あなたは何か他のものを考え出さなければなりません。認証を使用して、プログラムの起動時にユーザー名/パスワードの入力をユーザーに求め、それを使用することができます。ただし、人々はこれらのことを共有する傾向があるため、保護を強化することをお勧めします。
接続情報またはシークレットをapp.configに入れて暗号化できますが、コードを逆コンパイルし、再コンパイルし、コードを追加して自由に復号化できる人なら誰でもできます。
アプリで署名付きキーを提供し、それを認証メカニズムで使用できますが、それはバイパスできます。
IPアドレスを特定のIPアドレスに制限することはできますが、それらはなりすましの可能性があります。
でも...
上記のすべての手法を階層化することで、攻撃者が予防策を回避することを困難にすることができます。同様の要件があったアプリの1つで、次のことを行いました。
- 承認された各顧客のGUIDレコードと、その顧客に許可されているIPアドレスを保持するデータベースをセットアップしました。
- すべてのWebメソッドは、CustomerKeyパラメーターを必要とします。(上記のGUID)Webサービスを呼び出すたびに、キーがIPアドレスと照合されます。
- 一致する場合は、有効なデータが返されます。
- 失敗した場合は、有効なデータが返されます。実際には、適切なデータのように見えるものが返されますが、実際にはそうではありません。これにより、攻撃者が実際に防御を突破したかどうかを知ることが難しくなります。
- WinFormsアプリでは、キーはapp.configに格納され、main()イベント(WinFormsアプリのエントリポイント)で暗号化されます。これは、カジュアルな読者がアクセスできないようにするためです。
- プログラムはインストール時に自動的に起動されるため、起動時に暗号化が行われ、暗号化される前に誰かがファイルを読み取る可能性が最小限に抑えられます。
- また、コードは難読化されています。
防御を階層化することで、平均的な攻撃者を思いとどまらせることができれば幸いです。
Microsoftにもいくつかのガイドラインがあります:http://msdn.microsoft.com/en-us/library/ff648643.aspx