0

プロジェクトに DLL ファイル (cf.dll) があります。ファイルへ/から文字列を暗号化および復号化するためのいくつかの方法があります。

私の「cf.dll」には、次のメソッドがいくつかあります。

write "mystring" ---to-->> 新しい暗号化された dll

暗号化された dll を読み取る ---to--->> "mystring"

プロジェクトを公開したいのですが、エンド ユーザーが私の dll を自分のビジュアル スタジオで (dll を参照して) 使用すると、暗号化されたファイルを復号化できます。

私のプロジェクトは時々彼らのメソッドを使用するため、公開されたプロジェクトでこのdllが必要です。

今私の質問は次のとおりです。 この公開されたdll(cf.dll)を参照のないdllに変更して、ハッキングを防ぐにはどうすればよいですか。


編集(詳細):

私がしたいこと:

いくつかの接続文字列を (DataTable として) ファイルに暗号化し、このファイルをもう一度読みたいと思います。

この作業を行うための dll ファイルがあります。cf.dllです。暗号化と復号化のためのいくつかの方法があります。

暗号化ワークフロー>

DatatTable ------to------>> Xml as String ------cf.dll メソッドによる to------>> enc.dll

復号化ワークフロー

enc.dll ------ cf.dll メソッドにより ------>> Xml as String ------to------>> DataTable

すべてが正常に機能し、暗号化されたファイル (enc.dll) が作成されます。

しかし、エンド ユーザーが私の魔法の DLL (cf.dll) を Visual Studio の新しいプロジェクトで (それを参照して) 使用すると、暗号化されたファイル (enc.dll) を解読し、プログラムをハッキングできます。

したがって、DLL (cf.dll) を非参照 DLL に変更するか、別の安全なソリューションを使用して、このハッキングを防止したいと考えています。


編集:

接続文字列データを保持するためのマイ テーブル列:

Server    DbName    DbUser    DbPass    FileName

しかし、この暗号化メカニズムによって別の DataTable を保存するようお願いしてもよろしいですか。ConnectionStringだけでなく、任意の文字列を保存するための解決策を教えてください。あらゆるデータから非常に安全な暗号化ファイルが必要です。私のソリューションでは、各オブジェクトを文字列に変換し、dll メソッドを使用して暗号化されたファイルとして保存します (上記で説明した問題をうまく処理できます)。

4

3 に答える 3

4

dll を「非参照 dll」にすることはできませんが、(public ではなく)「internal」キーワードを使用してすべてのクラス/メソッドを非表示にすることができます。つまり、このクラス/メソッドは、現在の dll 内またはInternalVisibleTo属性で指定された DLL/EXE 内でのみ使用できます。したがって、誰もそれらを直接使用することはできませんが、これはマネージ コードであることを知っておく必要があります。そのため、誰でも DLL の内部を調べて、復号化のためにキーを抽出し、DLL にあるのと同じコードを記述できます。

于 2013-04-07T08:33:25.760 に答える
1

驚くべきことに、.NET アセンブリを使用して目標を達成することはできません。

コードを難読化することもできますが、それでも逆コンパイル可能で再利用可能です。それを妨げられるものは何もありません。あなたはバーを上げることができますが、誰かが - 彼女が望むなら - あなたが隠そうとしている情報を得ることができます.

(何か重要なことをオンラインで行う以外に、実際に機能するコピー防止メカニズムを見たことがありますか?)

常に次のことを考えてください: ユーザーから情報を隠したい場合は、その情報を配信しないでください。それ以外は難読化による単なる保護であり、多かれ少なかれ努力すればクラックできます。

于 2013-06-17T18:03:44.817 に答える
1

それは本当に素晴らしい質問 RAM です。あなたの問題に対するいくつかの解決策:

1) 別のアセンブリ (DLL) を作成しないで、DLL のコードを EXE に入れ、DLL の暗号化/復号化機能を「内部」にします (EXE の外部から誰も使用できないようにするため)。 . 次に、Eazfuscator のような無料のツールを使用して EXE を難読化します (そうしないと、コードが簡単に逆コンパイルして読み取れるからです)。

2) DLL を EXE のリソースに入れることができます (おそらく暗号化もされます)。次に、そこからそれを取得し、アプリが使用できるようにメモリにロードする方法を見つけることができます。しかし、初心者にとってこれは非常に複雑なことであり、.NET で実行できるかどうかは 100% 確信が持てません (自分で実行したことはありません)。ただし、実行可能だと思います。

3) 実際には、コードがクライアントのマシンで実行される場合、人々がコードを分析するのを防ぐためにできることはあまりありません。あなたができる最善のことは、彼らがそれをするのを少し(またはかなり)難しくすることです. たとえば、呼び出し元がランダムな質問に応答する必要があるロック メカニズムを DLL に追加できます。彼が正しく応答した場合は、復号化を実行します。そうでない場合は、例外をスローするか、null を返すか、間違った出力を返すことをお勧めします。ランダムな質問は、DLL が初期化時に生成する整数である可能性があり、EXE はこの整数を処理して、何らかの「秘密の」アルゴリズムに基づいて新しい整数を生成する必要があります。次に、EXE は何らかの形でこれを DLL に「フィード」し、その機能は「ロック解除」されます。

4) おそらく、リフレクションを使用して呼び出し元のアセンブリを分析し、特性や作成者の署名 (EXE に署名した場合) を見つけることができます。そうすれば、EXE が秘密鍵によって署名されていて、署名が有効である場合に、復号化を実行できます。しかし、それも少し複雑です。

5) EXE と DLL を 1 つの EXE ファイルにパックし、それらをある程度保護する「EXE パッカー」と呼ばれるツールがあると思います。私はまだそれらのいずれかを使用していません。

6) DLL の (3) で説明したものと同様に、複雑な方法で認証を要求する Web サイトで暗号化/復号化プロセスを移動できます。これにより、暗号化アルゴリズムを安全に保つことができますが、認証プロセスが分析され、ハッキングされる可能性があります。

実装が最も簡単なため、3番目のソリューションをお勧めします。4 つ目 (署名付きコードを使用) は最も安全ですが、実装するには多くの知識が必要です (私でさえ今は知らない知識です)。

素敵なコーディングを!:)

于 2013-06-17T16:41:56.780 に答える