-1

私は、間もなく登場するアプリの汎用ソフトウェアライセンスシステムに実装することをいとわない各要素またはシステムについて調査しました(これは機能するか、すべてのアプリケーションで使用できるため、無関係です)。

ライセンスクラスを含むDLLを作成しました。それは次のとおりです。


(1)

属性mainクラス(子クラスを含む)を適用しましたInternalsVisibleTo()。これにより、すべての内部クラスと、宣言されたそれらのメソッドがFriend、個別化されたPublicKeyを使用して外部アセンブリに表示されます。

アプリ名を参照しましたが、これはPublicKeyです。(ライセンスと外部アセンブリの両方が同じキー(.snkファイル)で署名されています

(2)

すべての(可能な場合)メンバー、プロパティなどは、削除されているFriendか、Privateまたは単にDim...edされています。

(3)

私のライセンスクラスにはString変数があります。宣言:

Private Shared _Key As String = "H58N2-00V93"

この変数は、私のDLLの特別なパスワードであり、私のDLLのメソッドにアクセスするために必要です。

次のように、メインクラスで初期化する必要があるPublic String変数(「」と呼びましょう)もあります。AccessKey

Dim licDLL As New LicensingAssemblyName.LicensingMainClass With {.AccessKey="H58N2-00V93"}

(4)

次に、Function( ""と呼びましょう)があります。これは、初期化された変数( " "が事前定義されたキー( " ")と等しいCheckKeyかどうかをチェックします。等しくない場合は、例外がスローされます-メソッドの継続/使用を防止します。PublicAccessKeyFriend_Key

(5)

などのすべての最初の行にSubFunctionこの関数の呼び出しを挿入しました。


これらは、外部アセンブリが別のアプリでDLLを使用して、システムを悪用したり、キーを生成したりするのを防ぐために私が取った「セキュリティ」対策にすぎません。

さて、ライセンス措置についてです。


(1)

私はキージェネレーター(非常に基本的)を持っています。これは、指定された形式でコードを生成します(#-$たとえば、数字、ダッシュ、文字の場合は "")。

Rijndaenalこのプログラムには、saltを使用して適用する暗号化クラスを含めました。

生成時に個別のキーを暗号化するようにキージェネレーターを設定し、それをファイルの新しい行に追加します。これを「my_licenses.txt」と呼びます。

私はそれぞれに同じパスワードを使用します(明らかに)。それはかなり長く、多くの異なる文字が含まれています(それが何か違いを生む場合)。これらのキーを保護する方法としてプレーンテキスト暗号化を使用しないようにアドバイスする別のプログラマーから言われるまで、誰もパスワードなしで文字列を復号化できるとは思わなかったので、これは安全な方法だと思いました。これを手伝ってください。

(2)

ライセンスDLLには、次の宣言があります。

Friend Shared Function IsKeyValid(ByVal KeyDB As String, ByVal Key As String) As Boolean

この関数は、ファイル内の各キーを復号化します(キー生成プログラムで暗号化するときに使用したのと同じパスコードを使用して、指定されたデータベース)。

次にFor EachNextループして、指定された「Key」値がキー「データベース」「my_licenses.txt」のいずれかに等しいかどうかを判断します。しかし、ここに問題があります。

Function(ハードウェアIDなどを使用して)実行しているコンピューターの一意のコードを返すがあります。これFunctionは、複数のコンピューターで同じキーが使用されないように保護するのに役立ち(これを許可するシステムを実装している場合を除き、限られた時間)、「キー」の最後の5文字として必要です。

チェック後、この関数は結果の値(TrueまたはFalse)を返します。


最後に(おい)、各アセンブリ(ライセンスのアセンブリとそれを利用する外部のアセンブリ)は、CodePlexのConfuser 無料で高度な.NETに推奨される難読化ツール)。

これが長すぎない/詳細が足りない/理解するのが難しいことではないことを願っています。(もしそうなら、あなたが理解していないことを教えてください)。

これは私の最初の投稿/質問ですので、よろしくお願いします。また、お読みいただきありがとうございます。

お役に立てば幸いです。

そして確認するために、私の質問はこれです:このシステムは平均的なハッカーから保護するのに十分安全ですか?

PS私はまだ初心者なので、初心者のための回答を特にいただければ幸いです;)

*更新:私は実際にこの質問の長さを減らし、理解しやすさを改善しました(信じられないかもしれませんが)。だからこれが私にできる最善のことです。

4

4 に答える 4

3

それは非常識なテキストの壁なので、あなたは私を失ってしまいました。そして、正直に言うと、配布する予定のバイナリ内にハードコードされたキーがあるのを見て、真剣に読むのをやめました...しかし、自分自身に尋ねるべき2つの質問があります。

  1. あなたのアプリケーションは非常に成功する可能性が高いので、適切なスキルセットを持つ人々がそれを逆転させてkeygenおよび/または海賊版をリリースする傾向があるように十分な需要がありますか?

  2. そして、アプリケーション自体を改善するために何もしないコードのライセンスを取得する代わりに、アプリケーションにクールな機能を追加することに時間を費やしたほうがいいのではないでしょうか。

誤解しないでください。私はすべて、仕事に対して報酬を得る人々のためであり、ソフトウェアのライセンスを取得する人々に反対しません。実際、私が取り組んだプロジェクトの1つは、最後にチェックした100,000を少し超えるライセンスを追跡するカスタムライセンスエンジンでした。ただし、ライセンスを実装する場合は、ライセンスを取得する実際のソフトウェアに費やす労力を超えないようにしてください。


そうは言っても、これが私がすることです:

  • 多数のライセンスキーを生成します(必要な形式を使用して)
  • SHA-256やSHA-512などを使用してこれらのキーをハッシュします。
  • キーハッシュを含む配列を(選択した言語に適した構文を使用して)作成します。
  • アプリケーション内に配列を含めます。

この設定では、ライセンスを確認するために必要なことは次のとおりです。

  • 以前と同じアルゴリズムを使用して入力をハッシュします。
  • 配列を繰り返し、ハッシュの結果と比較します。それらが一致する場合、キーはライセンスされます。そうでない場合は、続行します。
  • 表の最後に到達した場合、キーはライセンスされていません。
  • キーのライセンスが付与されていない場合は、アプリケーションをすぐに終了しないでください。代わりに、重要なコマンド(「保存」など)の使用を防ぐフラグを設定するか、タイマーを60秒に加えて乱数を設定してアプリケーションを終了します。

Authenticodeを使用してアプリケーションをコンパイルし、デジタル署名します。アプリケーション自体に署名を検証させて、カジュアルな改ざんを阻止しようとします。

気が向いている場合は、ハッシュを暗号化することもできますが、このスキームに対して誰かが攻撃するような攻撃を防ぐのに役立つ可能性は低いです。

明確にするために、これは防弾ではなく(この場合も、ライセンスメカニズムはありません)、十分なスキルを持った人がさまざまな方法でそれを破ることができます。しかし、それはほぼ確実にあなたのプロジェクトにとって十分以上のものになるでしょう。

于 2013-03-25T15:21:18.793 に答える
1

セキュリティには絶対値はありません。ペイオフに対して測定する必要があります。あなたのアプリがいくつかの核コードを保持しているなら、私はこれのために専門のコンサルタントにお金を払って行くと思います。おばあちゃんの秘密のレシピを保存しているなら、あなたは行ってもいいです。

投稿全体を読みましたが、ハードコードされたキーの目的や、各ライセンスの個々の暗号化キーをどのように管理するかはまだ明確ではありません。暗号化は、使用するアルゴリズムの強度やパスワードの長さだけではありません。また、パスワードをどのように非表示にするか、パスワードをどのように送信するか、エッジケース(接続の中断、復号化の失敗など)で何をするかなどについても説明します。

見た目からすると、あなたは「良い」カテゴリに属していると思います。これは、アプリが目立つターゲットのように聞こえず、フラストレーションのたまった開発者によるカジュアルなクラッキングの試みを阻止したいからです。あなたのライセンススキームが気に入らない人(:そして、コードをリバースエンジニアリングすることになると、難読化だけで最も抑止力があります。私はあなたのコードに精通していないので、ライセンスをバイパスする他のもっと簡単な方法があるかどうかを教えてください。マシンまたはユーザープロファイルに関連付けられていない場合にライセンスファイル自体をコピーする一般的な方法...

于 2013-03-25T15:11:39.213 に答える
0

オンラインには多くの回避策がありますが、ここで説明するハッシュシステム、または公開鍵暗号に基づくものだけが、ライセンスを提供するのに十分な安全性を備えています。

私は個人的に商用製品を好み、使用しています:http: //www.treekslicensinglibrary.com-Treekのライセンスライブラリ。これは、以前は公開鍵暗号を使用してライセンスを処理するため、安価でセットアップが簡単で、非常に安全です。

編集:シリアル番号のハッシュと比較するには-このソリューションでは、受け入れられたシリアル番号を事前に定義する必要はありません。アプリ内の1000ハッシュ=1000ライセンス、さらにアプリを更新する必要があります。公開鍵暗号ベースのライセンスシステムには、この欠点はありません。

于 2015-01-06T17:51:23.537 に答える
-1

.NETObfuscateアプリケーションを使用して保護できます。すべての.NETアプリケーションは.NETReflectorで逆コンパイルされる可能性があるため、ブラウザーでアプリケーションを検索して.netアプリケーションを難読化します。これは私が知っているように機能します、あなたのアプリケーションを逆コンパイルしたい人は誰でも難読化することによって防ぐでしょう

于 2014-10-06T08:52:41.673 に答える