C#アプリケーションのプロダクトキーを作成するにはどうすればよいですか?
-
19-08-2019 - |
質問
C#アプリケーションのプロダクトキーを作成するにはどうすればよいですか
毎年更新するプロダクト(またはライセンス)キーを作成する必要があります。さらに、試用版用に作成する必要があります。
関連:
解決
アプリケーションに対して認証するデータを含むレコードを作成するなどのことができます。これには、必要なものがすべて含まれます。有効にするプログラム機能、有効期限、ユーザー名(ユーザーにバインドする場合)。次に、固定キーで暗号化アルゴリズムを使用して暗号化するか、ハッシュします。次に、プログラム内で検証するだけです。ライセンスファイルを(Windowsで)配布する1つの方法は、レジストリを更新するファイルとして提供することです(ユーザーが入力する必要がなくなります)。
ただし、セキュリティの誤った認識に注意してください。遅かれ早かれ誰かがプログラムにパッチを当てて、そのチェックをスキップし、パッチを当てたバージョンを配布します。または、すべてのチェックに合格してそれを配布するキーを作成するか、クロックをバックデートするなど、スキームをどの程度複雑にするかは関係ありません。このために行うことは、最終的には隠蔽によるセキュリティになり、常にこれができる。たとえ誰かができなくても、ハッキングされたバージョンを配布します。あなたがドングルを提供する場合でも同じことが当てはまります-誰かが望めば、彼らもそのチェックを修正できます。コードにデジタル署名しても役に立ちません。彼らはその署名を削除したり、再署名したりできます。
デバッガーなどでプログラムが実行されないようにする技術を使用することで、問題を少し複雑にすることができますが、これでさえ防弾ではありません。したがって、正直なユーザーが支払いを忘れないように、十分に難しくする必要があります。また、あなたのスキームが有料ユーザーに邪魔にならないように非常に注意してください-有料顧客が彼らが支払ったものを使用できないようにするよりも、コピーを取り払うほうが良いです。
もう1つのオプションは、オンラインチェックを行うことです。ユーザーに一意のIDを提供し、そのIDに必要な機能をオンラインで確認し、一定期間キャッシュします。ただし、すべて同じ注意事項が適用されます-人々はこのようなものを回避できます。
キーを忘れたユーザーなどに対処するためのサポートコストも考慮してください。
編集:追加したいだけです。これに時間をかけすぎないか、どういうわけかあなたの複雑なスキームは異なっていて割れないだろうと思います。プログラムが実行されるハードウェアとOSを人々が制御する限り、それは不可能です。開発者は、このためにさらに複雑なスキームを考え出そうとしており、独自のシステムを開発する場合、そのシステムのみが知られるため、「より安全」になると考えています。しかし、実際には、永久モーションマシンを構築しようとするのと同等のプログラミングです。 :-)
他のヒント
あなたは誰を信頼しますか?
私は常に、この領域がサードパーティを信頼してアプリケーションのランタイムセキュリティを管理するにはあまりにも重要だと考えてきました。そのコンポーネントが1つのアプリケーションでクラックされると、すべてのアプリケーションでクラックされます。 Discreet は、サードパーティのライセンスソリューションを使用して 3ds Max 年前...楽しい時間を!
真剣に、アルゴリズムを完全に制御するために独自のロールを検討してください。その場合、次の行に沿ってキーのコンポーネントを使用することを検討してください。
- ライセンス名-ライセンスを取得しているクライアントの名前(ある場合)。企業の展開を管理するのに役立ちます-<!> quot; personalised <!> quot;提供するライセンス情報に名前を入力してください。
- ライセンスの有効期限
- 同じライセンスで実行するユーザーの数。これは、サーバーのようにサイト全体で実行中のインスタンスを追跡する方法があることを前提としています
- 機能コード-複数の機能および複数の製品で同じライセンスシステムを使用できます。もちろん、1つの製品でひびが入った場合、すべての製品でひびが入ります。
次に、それらを徹底的にチェックサムし、必要な(リバーシブル)暗号化を追加して、解読を困難にします。
試用版のライセンスキーを作成するには、上記の値に<!> quot;試用モード<!> quot;として変換される値を設定するだけです。
そしてこれはおそらくあなたのアプリケーション/会社でおそらく最も重要なコードであるため、難読化に加えて/難読化の代わりに、ネイティブDLLファイルに復号化ルーチンを置き、単に P / Invoke に。
これまで働いてきたいくつかの企業は、このために一般的なアプローチを採用しており、大きな成功を収めています。または、製品にクラックする価値がなかったかもしれません;)
Windowsプロダクトキーなど、入力できるキーについて尋ねる場合、それらはいくつかのチェックに基づいています。コピーペーストする必要があるキーについて話している場合、それらはデジタル署名(秘密キー暗号化)に基づいています。
単純なプロダクトキーロジックは、プロダクトキーが4つの5桁のグループ(abcde-fghij-kljmo-pqrst
など)で構成されていると言ってから、f + k + pがaと等しいなどの内部関係を指定することです。 2、3、および4グループの最初の数字は合計でaになります。これは、8xxxx-2xxxx-4xxxx-2xxxxが有効であること、つまり8xxxx-1xxxx-0xxxx-7xxxxも有効であることを意味します。もちろん、最初のグループの2番目の数字が奇数である場合、最後のグループの最後の数字も奇数であるような複雑な関係など、他の関係もあります。この方法では、プロダクトキーのジェネレーターが存在し、プロダクトキーの検証では、すべてのルールに一致するかどうかが確認されます。
暗号化は通常、秘密鍵(==デジタル署名)を使用して暗号化され、 Base64 。公開鍵はアプリケーションとともに配布されます。 Base64文字列が到着すると、公開キーによって検証(==復号化)され、有効であることが確認されると、製品がアクティブ化されます。
それが些細なものであれ、クラックするのが難しいものであれ、それが本当に大きな違いを生むかどうかはわかりません。
アプリがクラックされる可能性は、プロダクトキーの処理の強さではなく、その有用性にはるかに比例します。
個人的には、ユーザーには2つのクラスがあると思います。支払う人。しない人。そうするものは、おそらく最も些細な保護でさえそうするでしょう。そうしない人は、亀裂を待つか、他の場所を見ます。いずれにしても、それ以上お金を得ることができません。
私はむしろ非常識な何かをしたいと認めなければなりません。
- CPUボトルネックを見つけて、 P / Invokeable DLLファイルに抽出します。
- ビルド後のアクションとして、DLLファイルの一部をXORで暗号化します 暗号化キー。
- 公開/秘密キースキームを選択し、DLLファイルに公開キーを含めます
- プロダクトキーの復号化と2つのXOR 半分にすると、DLLの暗号化キーになります。
- DLLのDllMainコードで、保護を無効にします(PAGE_EXECUTE_READWRITE) キーで復号化します。
- の健全性チェックを行うLicenseCheck()メソッドを作成します ライセンスキーとパラメーター、DLLファイル全体のチェックサム、スロー いずれかのライセンス違反。ああ、他の初期化をする こちら。
LicenseCheckを見つけて削除すると、何が楽しくなるでしょう DLLがセグメンテーション違反を開始したとき。
Microsoftソフトウェアライセンスと保護(SLP)サービスのオプションもあります。それについて読んだ後、私はそれを本当に使いたいと思っています。
ライセンスに基づいてコードの一部をブロックするというアイデアが本当に好きです。ホットなもので、.NETで最も安全です。使用しなくても面白い読み物です!
Microsoft <!>#174;ソフトウェアライセンスと 保護(SLP)サービスは ソフトウェアアクティベーションサービス 独立系ソフトウェアベンダーを実現 (ISV)柔軟なライセンスを採用する 顧客に対する条件。マイクロソフト SLPサービスは独自の 保護に役立つ保護方法 アプリケーションとライセンス に到達できる情報 増加しながら市場をより速く 顧客コンプライアンス。
注:これは、機密コード(貴重なアルゴリズムなど)を含む製品をリリースする唯一の方法です。
シリアル番号を作成して確認するだけの簡単なソリューションが必要な場合は、 Ellipter を試してください。楕円曲線暗号を使用し、<!> quot;有効期限<!> quot;試用版または期間限定の登録キーを作成できるようにする機能。
プロダクトキーとアクティベーション用のもう1つの安価なツールは、InstallKeyと呼ばれる製品です。 www.lomacons.com
をご覧ください。 1つの簡単な方法は、グローバル一意識別子(GUID)を使用することです。 GUIDは通常、128ビット値として保存され、一般に32桁の16進数として表示され、グループは{21EC2020-3AEA-4069-A2DD-08002B30309D}
などのハイフンで区切られます。
System.Guid.NewGuid()
でC#で次のコードを使用します。
getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string.
_key = Convert.ToString(Regex.Replace(getKey, ".{4}", "$0/")); // And use this to separate every four digits with a "/".
お役に立てば幸いです。
コツは、あなただけが知っているアルゴリズムを使用することです(たとえば、反対側でデコードできるようにする)。
<!> quot;素数を選択してそれにマジックナンバーを追加する<!> quot;
のような単純なものがあります一連のバイナリデータの非対称暗号化(一意の識別子、バージョン番号などを含む)を使用したり、暗号化されたデータをキーとして配布するなど、より複雑なオプション。
この質問への回答も読む価値があります
いくつかのツールとAPIが利用可能です。ただし、無料で見つかるとは思わない;)
たとえば、OLicenseスイートがあります。 http://www.olicense.de/index.php?lang=en
LicenseSpot を確認できます。以下を提供します。
- 無料ライセンスコンポーネント
- オンラインアクティベーション
- アプリとオンラインストアを統合するAPI
- シリアル番号の生成
- ライセンスの取り消し
- サブスクリプション管理
@frankodwyerの素晴らしい答えに少し便乗し、オンラインベースのライセンスについてもう少し詳しく見ていきます。私は、開発者向けに構築されたライセンスREST APIである Keygen の創設者です。
2つの<!> quot; types <!> quot;が必要だと述べたので、アプリケーションのライセンス、つまり<!> quot; full version <!> quot; <!> quot;試用版<!> quot ;、それを簡素化し、アプリケーションの特定の機能をライセンスする機能ライセンスモデルを使用できます(この場合、<!> quot; full <!> quot; feature-setおよび<!> quot; trial <!> quot; feature-set)。
最初に、2つのライセンスタイプ(Keygenではポリシーと呼ばれます)を作成し、ユーザーがアカウントを登録するたびに<!> quot;トライアルを生成できます<!> quot;開始するためのライセンス(<!> quot; trial <!> quot;ライセンス implements 私たちの<!> quot; trial <!> quot;機能ポリシー)アプリ内のさまざまなチェックユーザーは Trial-Feature-A および Trial-Feature-B を使用できます。
さらに、ユーザーがアプリを購入するたびに(PemPal、Stripeなどを使用している場合)、<!> quot; full <!を実装するライセンスを生成できます。 > quot;機能ポリシーを作成し、ユーザーのアカウントに関連付けます。これで、アプリ内でユーザーに<!> quot; full <!> quot;があるかどうかを確認できます。 Pro-Feature-X および Pro-Feature-Y を実行できるライセンス(user.HasLicenseFor(FEATURE_POLICY_ID)
などの操作により)。
ユーザーがユーザーアカウントを作成できるようにすることについて <!>#8212;それはどういう意味ですか?詳細については、 a他にもいくつかの回答がありますが、ユーザーを認証して識別するための優れた方法だと思う理由について簡単に説明します:
- ユーザーアカウントを使用すると、複数のライセンスと複数のマシンを単一のユーザーに関連付けることができ、顧客の行動に関する洞察を得ることができます <!> quot;アプリ内購入<!> quot; 、つまりあなたの<!> quot; full <!> quot;バージョン(モバイルアプリのようなもの)。
- 長いライセンスキーを入力するように顧客に要求するべきではありません。長いライセンスキーを入力するのは面倒であり、追跡が困難です。つまり、簡単に紛失してしまいます。 (Twitterで<!> quot; lost license key <!> quot;を検索してください!)
- 顧客はメール/パスワードを使用することに慣れています 。優れたユーザーエクスペリエンス(UX)を提供できるように、人々が慣れていることを実行する必要があると思います。
もちろん、ユーザーアカウントの処理をしたくない場合、ユーザーにライセンスキーの入力をしたい場合は、まったく問題ありません(Keygen それもサポートしています)。ライセンス供与のその側面を処理するための別の方法を提供しているだけで、うまくいけばお客様に素晴らしいUXを提供します。
最後に、これらのライセンスを毎年更新することも述べたので、ポリシーに duration を設定して、<!> quot; full <!> quot;ライセンスは1年後に失効し、<!> quot; trial <!> quot;ライセンスの有効期限は2週間で、ユーザーは有効期限が切れた後に新しいライセンスを購入する必要があります。
さらに掘り下げて、マシンとユーザーなどを関連付けることができますが、この答えを短くして、ユーザーへの機能のライセンス供与に集中しようと思いました。
この回答を確認してください: https://stackoverflow.com/a/38598174/1275924
アイデアは、ライセンスサーバーとして Cryptolens を使用することです。次に、ステップバイステップの例(C#およびVB.NET)を示します。また、キー検証用のコードスニペットを以下に添付しました(C#で):
var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";
var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
Key = licenseKey,
ProductId = 3349,
Sign = true,
MachineCode = Helpers.GetMachineCode()
});
if (result == null || result.Result == ResultType.Error ||
!result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
// an error occurred or the key is invalid or it cannot be activated
// (eg. the limit of activated devices was achieved)
Console.WriteLine("The license does not work.");
}
else
{
// everything went fine if we are here!
Console.WriteLine("The license is valid!");
}
Console.ReadLine();