web-dev-qa-db-ja.com

C#アプリケーションのプロダクトキーを作成するにはどうすればよいですか?

C#アプリケーションのプロダクトキーを作成するにはどうすればよいですか?

毎年更新するプロダクト(またはライセンス)キーを作成する必要があります。さらに、試用版用に作成する必要があります。

関連する:

88
J3r3myK

アプリケーションに対して認証するデータを含むレコードを作成するなどのことができます。これには、必要なものがすべて含まれます。有効にするプログラム機能、有効期限、ユーザー名(ユーザーにバインドする場合)。次に、固定キーで暗号化アルゴリズムを使用して暗号化するか、ハッシュします。次に、プログラム内で検証するだけです。ライセンスファイルを(Windowsで)配布する1つの方法は、レジストリを更新するファイルとして提供することです(ユーザーが入力する必要がなくなります)。

ただし、セキュリティに対する誤った認識に注意してください。遅かれ早かれ誰かがプログラムにパッチを当てて、そのチェックをスキップし、パッチを当てたバージョンを配布することになります。または、彼らはすべてのチェックに合格してそれを配布するキーを作成するか、クロックをバックデートするなど。あなたがあなたのスキームをどのように複雑にするかは関係ありません。これができる。たとえ誰かができなくても、ハッキングされたバージョンを配布します。あなたがドングルを提供する場合でも同じことが当てはまります-誰かが望めば、彼らもそのチェックを修正できます。コードにデジタル署名しても役に立ちません。彼らはその署名を削除したり、再署名したりできます。

デバッガーなどでプログラムが実行されないようにする技術を使用することで、問題を少し複雑にすることができますが、これでも完全な証拠ではありません。したがって、正直なユーザーが支払いを忘れないように、十分に難しくする必要があります。また、あなたのスキームが有料のユーザーにとって邪魔にならないように非常に注意してください-有料の顧客が自分が支払ったものを使用できないようにするよりも、コピーを取り払う方が良いです。

もう1つのオプションは、オンラインチェックを行うことです。ユーザーに一意のIDを提供し、そのIDに必要な機能をオンラインで確認し、一定期間キャッシュします。しかし、すべての同じ警告が適用されます-人々はこのようなものを回避することができます。

キーを忘れたユーザーなどに対処するためのサポートコストも考慮します。

編集:追加したい、これに時間をかけすぎない、またはどういうわけかあなたの複雑なスキームは異なっていて割れないだろうと思う。それは、人々がハードウェアを制御し、プログラムが実行されるOS開発者は、このためにさらに複雑なスキームを考え出そうとしており、独自のシステムを開発すれば、彼らだけが知っているため、「より安全」であると考えています。永久モーションマシンを構築しようとするのと同じプログラミング:-)

80
frankodwyer

誰を信頼しますか?

私は常に、この領域が非常に重要であると考えており、サードパーティがアプリケーションのランタイムセキュリティを管理するには信頼できないと考えています。そのコンポーネントが1つのアプリケーションでクラックされると、すべてのアプリケーションでクラックされます。 ds Max 数年前にサードパーティのライセンスソリューションを使用すると、5分後に Discreet が発生しました。

真剣に、アルゴリズムを完全に制御するために独自のロールを検討してください。使用する場合は、次の行に沿ってキーでコンポーネントを使用することを検討してください。

  • ライセンス名-ライセンスを取得するクライアントの名前(ある場合)。企業の展開を管理するのに役立ちます-提供するライセンス情報に「個人用」の名前を付けると、特別な気分になります。
  • ライセンスの有効期限
  • 同じライセンスで実行するユーザーの数。これは、サーバーのように、サイト全体で実行中のインスタンスを追跡する方法があることを前提としています
  • 機能コード-複数の機能および複数の製品で同じライセンスシステムを使用できます。もちろん、1つの製品でひびが入った場合、すべての製品でひびが入ります。

次に、それらをチェックサムし、必要な(リバーシブル)暗号化を追加して、解読を困難にします。

トライアルライセンスキーを作成するには、上記の値に「トライアルモード」として変換される値を設定するだけです。

そしてこれはおそらくあなたのアプリケーション/会社でおそらく最も重要なコードなので、難読化に加えて/難読化の代わりに、復号化ルーチンをネイティブのDLLファイルと単に P/Invoke それに。

私が働いてきたいくつかの企業は、このために一般的なアプローチを採用しており、大きな成功を収めています。または、製品にクラックする価値がなかったかもしれません;)

15
Spiffeah

Windowsプロダクトキーなど、入力できるキーについて尋ねている場合、それらはいくつかのチェックに基づいています。コピーペーストする必要があるキーについて話している場合、キーはデジタル署名(プライベートキー暗号化)に基づいています。

単純なプロダクトキーロジックは、プロダクトキーがabcde-fghij-kljmo-pqrstのような4つの5桁のグループで構成されていることから始め、次にf + k + pがaに等しくなるような内部関係を指定することから始まります。 2、3、および4グループの最初の桁は合計でaになります。これは、8xxxx-2xxxx-4xxxx-2xxxxが有効であることを意味し、8xxxx-1xxxx-0xxxx-7xxxxも有効です。もちろん、最初のグループの2番目の数字が奇数である場合、最後のグループの最後の数字も奇数であるような複雑な関係を含む他の関係もあります。この方法では、プロダクトキーのジェネレーターが存在し、プロダクトキーの検証では、すべてのルールに一致するかどうかを確認するだけです。

暗号化は通常、秘密キー(==デジタル署名)を使用して暗号化され、 Base64 に変換されたライセンスに関する情報の文字列です。公開鍵はアプリケーションとともに配布されます。 Base64文字列が届くと、公開鍵によって検証(==復号化)され、有効であることが確認されると、製品がアクティブ化されます。

11
Kinjal Dixit

些細なものであれ、クラックするのが難しいものであれ、本当に大きな違いを生むかどうかはわかりません。

アプリがクラックされる可能性は、プロダクトキーの処理の強さではなく、その有用性にはるかに比例します。

個人的には、ユーザーには2つのクラスがあると思います。支払う人。しない人。そうする人は、おそらく最も些細な保護でさえそうするでしょう。そうしない人は、亀裂を待つか、他の場所を見ます。いずれにせよ、それはあなたにこれ以上お金をもたらさないでしょう。

8
spender

私はむしろ非常識な何かをしたいと認めなければなりません。

  1. CPUボトルネックを見つけて、それを P/Invokeable DLLファイルに抽出します。
  2. ビルド後のアクションとして、DLLファイルの一部をXOR暗号化キーで暗号化します。
  3. 公開/秘密キースキームを選択し、DLLファイルに公開キーを含めます
  4. プロダクトキーの暗号化を解除し、2つの半分をXORすることにより、DLLの暗号化キーが生成されるように調整します。
  5. DLLのDllMainコードで、保護(PAGE_EXECUTE_READWRITE)を無効にし、キーで復号化します。
  6. ライセンスキーとパラメーターの健全性チェックを行うLicenseCheck()メソッドを作成してから、DLLファイル全体をチェックサムし、いずれかでライセンス違反をスローします。ああ、ここで他の初期化を行います。

LicenseCheckを見つけて削除すると、DLLが開始されたときに セグメンテーション違反

6
Joshua

シリアル番号を作成して確認するだけの簡単なソリューションが必要な場合は、 Ellipter を試してください。楕円曲線暗号を使用し、「有効期限」機能を備えているため、試用版または期間限定の登録キーを作成できます。

5
Roland

オプション Microsoft Software Licensing and Protection (SLP)Servicesもあります。それについて読んだ後、私はそれを使用できることを本当に望みます。

私は、ライセンスに基づいてコードの一部をブロックするというアイデアが本当に好きです。ホットなもので、.NETで最も安全です。使用しなくても面白い読み物です!

Microsoft®ソフトウェアライセンスおよび保護(SLP)サービスは、独立系ソフトウェアベンダー(ISV)が顧客に柔軟なライセンス条件を採用できるようにするソフトウェアアクティベーションサービスです。 Microsoft SLP Servicesは、アプリケーションとライセンス情報を保護する独自の保護方法を採用しており、顧客のコンプライアンスを向上させながら、より迅速に市場に参入することができます。

注:これは、機密コード(貴重なアルゴリズムなど)を含む製品をリリースする唯一の方法です。

5
ccook

プロダクトキーとアクティベーションのためのもう1つの優れた安価なツールは、InstallKeyと呼ばれる製品です。 www.lomacons.com をご覧ください

2
Che

1つの簡単な方法は、 Globally Unique Identifier (GUID)を使用することです。 GUIDは通常128ビット値として保存され、一般的に_{21EC2020-3AEA-4069-A2DD-08002B30309D}_などのグループをハイフンで区切った32桁の16進数として表示されます。

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 "/".
_

役に立てば幸いです。

2
Aishwar C Nigam

秘Theは、あなただけが知っているアルゴリズムを使用することです(相手側でデコードできるように)。

「素数を選んでマジックナンバーを追加する」などの簡単なことがあります

バイナリデータのセット(一意の識別子、バージョン番号などを含む)の非対称暗号化の使用や、暗号化されたデータのキーとしての配布など、より複雑なオプション。

この質問 への回答も読む価値があるかもしれません

1
Rowland Shaw

いくつかのツールとAPIが利用可能です。しかし、私はあなたが無料でそれを見つけるとは思わない;)

たとえば、OLicenseスイートがあります。 http://www.olicense.de/index.php?lang=en

1

LicenseSpot を確認できます。以下を提供します。

  • 無料ライセンスコンポーネント
  • オンラインアクティベーション
  • アプリとオンラインストアを統合するAPI
  • シリアル番号生成
  • ライセンスを取り消す
  • サブスクリプション管理
0
Jose

この回答を確認してください: 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();
0
Artem

@frankodwyerのすばらしい答えに少し便乗し、オンラインベースのライセンスについてもう少し詳しく見ていきます。私は Keygen 、ライセンスREST開発者向けに構築されたAPI)の創設者です。

アプリケーションのライセンスの2つの「タイプ」、つまり「フルバージョン」と「トライアルバージョン」が必要であると述べたので、それを簡素化し、機能ライセンスモデルを使用できます。アプリケーションの特定の機能のライセンスを取得します(この場合、「フル」機能セットと「トライアル」機能セットがあります)。

まず、2つのライセンスタイプ(Keygenではpoliciesと呼ばれる)とユーザーがいつでも作成できますアカウントを登録して、開始するための「トライアル」ライセンス(「トライアル」ライセンスimplements「トライアル」機能ポリシー)を生成できます。アプリ内のチェックユーザーはTrial-Feature-AおよびTrial-Feature-Bを使用できます。

それに基づいて、ユーザーがアプリを購入するたびに(Paypal、Stripeなどを使用しているかどうか)、「フル」機能ポリシーを実装するライセンスを生成し、それをユーザーのアカウントに関連付けます。これで、アプリ内で、ユーザーがPro-Feature-XおよびPro-Feature-Yuser.HasLicenseFor(FEATURE_POLICY_ID)のようなことをすることによって)。

ユーザーがユーザーアカウントを作成できるようにすることを説明しました—それはどういう意味ですか? 他のいくつかの回答 で詳細に説明しましたが、なぜこれがユーザーを認証および識別する優れた方法であると思うかについての簡単な要約:

  1. ユーザーアカウントを使用すると、複数のライセンス複数のマシン単一ユーザーに関連付けることができます、顧客の行動についての洞察を提供し、「アプリ内購入」、つまり「フル」バージョン(モバイルアプリのようなもの)を購入するよう促します。
  2. 長いライセンスキーを入力するように顧客に要求するべきではありません。長いライセンスキーは入力するのが面倒であり、追跡するのが困難です。つまり、簡単に紛失します。 (Twitterで「失われたライセンスキー」を検索してみてください!)
  3. 顧客は、電子メール/パスワードを使用することに慣れています。優れたユーザーエクスペリエンス(UX)を提供できるように、人々が慣れていることを実行する必要があると思います。

もちろん、ユーザーアカウントを処理したくないと、ライセンスキーを入力するユーザーをしたくないの場合は、完全に問題ありません(およびKeygen それもサポートしています )。ライセンス供与のその側面を処理し、顧客に素敵なUXを提供することを目的とした別の方法を提供しています。

最後に、これらのライセンスを毎年更新することも述べたので、ポリシーにdurationを設定して、「フル」ライセンスが1年後に期限切れになり、「トライアル」ライセンスになるようにすることができます。最後の2週間は、有効期限後にユーザーが新しいライセンスを購入することを要求します。

さらに掘り下げて、マシンとユーザーなどを関連付けることができましたが、この答えを短くして、ユーザーに機能をライセンスするだけに集中したいと思いました。

0
ezekg