私は、間もなく登場するアプリの汎用ソフトウェアライセンスシステムに実装することをいとわない各要素またはシステムについて調査しました(これは機能するか、すべてのアプリケーションで使用できるため、無関係です)。
ライセンスクラスを含む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
かどうかをチェックします。等しくない場合は、例外がスローされます-メソッドの継続/使用を防止します。Public
AccessKey
Friend
_Key
(5)
などのすべての最初の行にSub
、Function
この関数の呼び出しを挿入しました。
これらは、外部アセンブリが別のアプリでDLLを使用して、システムを悪用したり、キーを生成したりするのを防ぐために私が取った「セキュリティ」対策にすぎません。
さて、ライセンス措置についてです。
(1)
私はキージェネレーター(非常に基本的)を持っています。これは、指定された形式でコードを生成します(#-$
たとえば、数字、ダッシュ、文字の場合は "")。
Rijndaenal
このプログラムには、saltを使用して適用する暗号化クラスを含めました。
生成時に個別のキーを暗号化するようにキージェネレーターを設定し、それをファイルの新しい行に追加します。これを「my_licenses.txt」と呼びます。
私はそれぞれに同じパスワードを使用します(明らかに)。それはかなり長く、多くの異なる文字が含まれています(それが何か違いを生む場合)。これらのキーを保護する方法としてプレーンテキスト暗号化を使用しないようにアドバイスする別のプログラマーから言われるまで、誰もパスワードなしで文字列を復号化できるとは思わなかったので、これは安全な方法だと思いました。これを手伝ってください。
(2)
ライセンスDLLには、次の宣言があります。
Friend Shared Function IsKeyValid(ByVal KeyDB As String, ByVal Key As String) As Boolean
この関数は、ファイル内の各キーを復号化します(キー生成プログラムで暗号化するときに使用したのと同じパスコードを使用して、指定されたデータベース)。
次にFor Each
、Next
ループして、指定された「Key
」値がキー「データベース」「my_licenses.txt」のいずれかに等しいかどうかを判断します。しかし、ここに問題があります。
Function
(ハードウェアIDなどを使用して)実行しているコンピューターの一意のコードを返すがあります。これFunction
は、複数のコンピューターで同じキーが使用されないように保護するのに役立ち(これを許可するシステムを実装している場合を除き、限られた時間)、「キー」の最後の5文字として必要です。
チェック後、この関数は結果の値(True
またはFalse
)を返します。
最後に(おい)、各アセンブリ(ライセンスのアセンブリとそれを利用する外部のアセンブリ)は、CodePlexのConfuser (無料で高度な.NETに推奨される難読化ツール)。
これが長すぎない/詳細が足りない/理解するのが難しいことではないことを願っています。(もしそうなら、あなたが理解していないことを教えてください)。
これは私の最初の投稿/質問ですので、よろしくお願いします。また、お読みいただきありがとうございます。
お役に立てば幸いです。
そして確認するために、私の質問はこれです:このシステムは平均的なハッカーから保護するのに十分安全ですか?
PS私はまだ初心者なので、初心者のための回答を特にいただければ幸いです;)
*更新:私は実際にこの質問の長さを減らし、理解しやすさを改善しました(信じられないかもしれませんが)。だからこれが私にできる最善のことです。