4

重複: dll を保護するには?

C# DLL がサード パーティのアプリケーションに使用されないように保護したいと考えています。この DLL を使用するのは自分のアプリケーションのみです。どうすればそれを達成できますか?

ありがとうございました。

4

5 に答える 5

14

すべてをDLL内で内部化してから、Properties\AssemblyInfo.cs で、アプリケーションの厳密な名前のみを指すようにInternalsVisibleTo属性を設定します。

于 2009-07-10T14:12:00.467 に答える
13

これは単に不可能です。

コード アクセス セキュリティ システム全体は、セキュリティの決定はコードの作成者ではなく、コードを実行しているユーザーが行うという考えに基づいています。コードの作成者であるあなたは、セキュリティに関する決定事項をユーザーに伝えることができません。あなたはユーザーのしもべであり、ユーザーのマスターではありません。

これで、サードパーティのコードがコードを使用するのを困難にすることができます。さまざまなセキュリティ属性を使用して、サードパーティのコードが自分のコードを使用しないことを意図していることを文書化できます。これらは良いステップですが、ユーザーがあなたに敵対している世界では、実際に問題を解決することはできません。CAS モデルでは、ユーザーが常に勝ちます。

たとえば、スタック ウォークをトリガーしてコール スタック上の全員が特定の証拠を持っているかどうかを確認するセキュリティ デマンドを実行するコード内のメソッドを作成できます。たとえば、「この DLL は、Guillaume のオフィスの引き出しにロックされている、Guillaume の厳密な名前の秘密鍵で署名されている」という証拠は、チェックするのに適した証拠です。これにより、コードを呼び出すすべての人があなたのコードでもあることがほぼ保証されます。

しかし、それは厳密な名前の署名の目的ではありません。厳密な名前の署名の目的は、ユーザーが実行していると考えているコードが実際にあなたからのものであることをユーザーが認識できるようにすることです。セキュリティ ツールを本来の目的以外に使用することは危険です。それはあなたに完全に誤った安心感を与えます。

あなたのユーザーが、あなたの DLL を使用する、あなたのものではないアプリケーションを作成したいとします。ユーザーは完全に信頼できるコードを書くことができ、完全に信頼できるコードには証拠を偽造する権利があります。それが「完全に信頼される」ということです。したがって、ユーザーはあなたによって署名されていないアプリケーションを作成しますが、ユーザーはそのアプリケーションを完全に信頼できるため、完全に信頼されたアプリケーションは、コードがあなたからのものであるという証拠を偽造することができます.

さらに言えば、ユーザーが単にコードを取得し、署名を削除して、それを自分の署名に置き換えることを止めるものは何もありません。EULA でそれが禁止されていると言えますし、見つけたら訴えることもできますが、それを止めるために何もすることはできません。

また、ユーザーは、必要に応じてセキュリティ システム全体を無効にすることができます。その場合、何でも実行できます。

DLL を顧客に出荷するかどうかを検討する必要があります。公開したくない秘密が含まれている場合は、それらの秘密を何千人もの顧客と共有しないでください。DLL を独自のサーバーに保持し、Web 経由でサービスを提供する場合、DLL を顧客に出荷することはありません。したがって、意図した以外の目的で自分のマシンで DLL を使用することはできません。

于 2009-07-10T17:58:18.967 に答える
3

効果的な障壁は1つではありませんが、DLLへのバインドを阻止するためにいくつかのハードルを設定できます。

  1. パブリッシャーおよび/またはIDコードアクセスセキュリティ権限を使用して、呼び出し元のコードが自分からのものであることを確認できるようにします(x509certテストおよびstrongnameを介して)。アセンブリに署名するときに-tを使用することを忘れないでください。そうしないと、x509certの有効期限が切れると失敗します。

(厳密な名前はアセンブリを識別し、発行者はアセンブリを発行した人を識別します。)

また、保護している資産でプログラムで実行できる.NETでのCASセキュリティの無効化を確認することもできます。

  1. DLLポストビルドを難読化します(ただし、署名する前に)。

  2. ある種のライセンスチェックの最終的なプログラムチェックを追加することを検討してください。

HTH

Phil '

于 2009-07-10T14:19:23.267 に答える
1

この保護は 2 重にする必要があることに注意してください。DLL だけを保護すると、ハッカーはアプリケーションの分析を開始して、アプリケーションがどのように DLL を呼び出しているかを知ることになります。さらに、サードパーティが DLL に完全にアクセスできる場合、保護がどれほど強力であっても、DLL の内部動作を発見することに成功します。一部の保護スキームは、他のものよりもクラックするのに時間がかかります。基本的に、DLL の保護は、この DLL の値に依存する必要があります。ハッカーがあなたの DLL をハッキングすることで何百万ドルも節約したり稼いだりすることができるなら、彼らは確実にそれを行うでしょう。DLL が最小限の金銭的利益を提供するだけの場合、DLL をクラックすることさえ気にしない可能性が高くなります。

DLL コードを安全に保ちたい場合は、どこかに Web サービスをセットアップし、ローカル DLL の代わりにこのサービスを呼び出すようにアプリケーションをセットアップします。そうすれば、ハッカーはあなたのライブラリにアクセスするのにもっと苦労するでしょう. 残念ながら、ユーザーが継続的にインターネットに接続している必要もあります。

(基本的に、これがクラウド コンピューティングの人気が高まっている理由です。ユーザーはクラウド アプリケーションを使用できますが、バイナリにはアクセスできません。)

于 2009-07-10T14:32:27.643 に答える
0

あなたのコードを難読化することは補完的な解決策です

于 2009-07-10T14:19:25.200 に答える