2016-12-29 24 views
5

現在、C#のmysql接続情報をクラスファイル自体に格納していますが、それはスマートではないようです。エンドユーザーは、リフレクタを使用してobfruscated 。C#データベース接続情報を保護する

どうすればこれらの情報を安全に保存できますか?

ソースコード:

private void Initialize() 
{ 
    server = "xxx"; 
    database = "xxx"; 
    uid = "xxx"; 
    password = "xxx"; 
    string connectionString; 
    connectionString = "SERVER=" + server + ";" + "DATABASE=" + 
    database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";"; 

    connection = new MySqlConnection(connectionString); 
} 
+1

ローカルセキュリティに依存することは、どのような種類のセキュリティでもありません。複数の隔離されたエンドユーザーが接続するデータベースをリモートでホストする場合は、ユーザーにデータベースへの直接アクセスを許可するのではなく、Webサービス(API)を介して公開する必要があります。使用しているローカルセキュリティに関係なく、接続文字列を取得することは可能です。パスワードでさえ、リフレクションによって利用可能になる可能性があります。これは、MS SQL接続を使用しています。 – john

+1

この詳細をweb.configまたはapp.configに保存し、それらが暗号化されていることを確認することをお勧めします。この投稿を確認してください。 http:// stackoverflow。com/questions/10168240/crypting-a-c-stringの暗号化 –

+1

Webサービス(API)が利用できない場合、機密データを少なくとも暗号化できます。それはまだ得られるが、少なくとも誰もが得ることはできない。 – Vladimir

答えて

3

ローカルアプリケーションのセキュリティに対処するためにこれを回答しています。OPの状況はウェブアプリケーションと同じように扱われていますが、OPの状況は同じです。

セキュリティ上の懸念がある複数のユーザーが1つのデータベースを共有している場合は、データベース接続文字列をコード内、構成内、構成内で暗号化して保存しないでください。クライアントはこの情報を決して持ってはいけません。これは、真にクライアント側のセキュリティを保証する唯一の方法です。

あなたのコードをリバースエンジニアリングするだけで、接続の詳細の暗号化を解除することができます。さらに、.NET Reflectorのようなものを使用してコードをデバッグする場合は、リフレクションを使用して、接続文字列(パスワードを含む)を接続オブジェクトから引き出すことができます。次に、データベースに直接接続して、必要な情報を抽出することは自明です。もちろん、IPホワイトリストを持っている可能性もありますが、そのうちの1人が悪い場合は、同じ問題が残ります。

あなたのデータベースを操作するWebサービスを作成することをお勧めします。エンドユーザーが使用するソフトウェアは、ユーザーの資格情報を使用してWebサービスで簡単に認証され、それを使用して許可されたリソースにアクセスします。これは、多くの最新のアプリケーションが動作する方法です。各ユーザーが自分のデータベースを持っている場合、これは、ユーザーのマシンにアクセスして、悪意のある人を除いて、ほとんどの問題を防止するのに十分であるように


は、あなたは単に、ローカルに暗号化された接続文字列を格納することができます。

明らかに、これは一般的な解決策(これを設定で暗号化し、最高のものを願っている)として使用することができますが、セキュリティが必要な場合はこれをお勧めしません。たとえば、データベースにユーザーパスワードを格納する場合(ハッシュフォームであっても)、これは安全なアイデアではありません。誰もがこの方法を使用して実行するリスクは、誰かがあなたのすべてのデータを盗んだり、すべてのデータを消去したり、データを操作してその利点を生かすことができるということです。

+0

Webサービスを実行するには、Linuxサーバーの代わりにWindowsサーバーが必要ですか? – user7347727

+0

Linuxも使えます。 MonoはWebサービスをホストできます。 – john

3

.NETで接続文字列を保護するための標準的な方法は、あなたの設定ファイルでそれらを暗号化することです。

aspnet_regiis -pe "connectionStrings" -app "/SampleApplication" 

あなたはそれを実行したときに、これを解読するためにキーを使用するようにアプリケーションへのアクセスを許可する必要があります、MSDN article on secure connection stringsを参照してください。

+0

これはデスクトップアプリケーションでも機能しますか? – john

関連する問題