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


90

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

毎年更新する製品(またはライセンス)キーを作成する必要があります。さらに、試用版用に1つ作成する必要があります。

関連:



J3r3myKが質問を投稿した後に投稿された@stukelly ...
Dozer789

回答:


83

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

ただし、誤った安心感に注意してください。遅かれ早かれ、誰かがプログラムにパッチを適用してそのチェックをスキップし、パッチを適用したバージョンを配布します。または、すべてのチェックに合格して配布するキーを作成し、それを配布したり、時計をバックデートしたりします。どのように複雑に計画を立ててもかまいません。これを行うために行うことは、最終的にはあいまいであることによるセキュリティであり、常にこれができる。彼らができない場合でも、ハッキングされたバージョンを配布します。あなたがドングルを提供する場合でも同じことが当てはまります-誰かが望めば、彼らはそれについてもチェックをパッチすることができます。コードへのデジタル署名は役に立ちません。その署名を削除したり、再署名したりする可能性があります。

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

別のオプションは、オンラインチェックを行うことです。ユーザーに一意のIDを提供し、そのIDが持つべき機能をオンラインでチェックして、一定期間キャッシュします。ただし、同じ警告がすべて当てはまります。人々はこのようなものを回避できます。

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

編集:私は単に追加したいので、これにあまり時間をかけないでください。または、どういうわけかあなたの複雑なスキームは異なり、解読不可能だと思います。プログラムが動作するハードウェアとOSを人々が制御する限り、そうなることはありませんし、そうすることもできません。開発者はこれのためにこれまで以上に複雑なスキームを考え出そうとしており、それのために独自のシステムを開発すればそれは彼らだけに知られ、したがって「より安全」になると考えています。しかし、それは実際には永久運動機械を構築しようとするプログラミングと同等です。:-)


1
良い要約。これがCheatEngineの検索をバイパスするのが簡単であると誰もが信じていない場合は、プログラマー以外の人が簡単に実行できるようになります。このレイヤーをシンプルにするのが最善です。
ケリー、

私は同じ問題を抱えています。検証のために、有効期限と最後にログに記録された日付でアプリのライセンスキーを作成しましたが、問題は、ファイルを編集して最後にログに記録された日付を更新するために秘密鍵を追加する必要があることです。キーをコードに入れるスマートな方法ではありません。何かアドバイス ?
Doicare

16

誰を信頼しますか?

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

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

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

次に、それらの全体をチェックサムし、解読を困難にするために、必要なすべての(可逆)暗号化を追加します。

試用版のライセンスキーを作成するには、上記の値を「試用版モード」に変換する値を設定するだけです。

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

私が働いてきたいくつかの会社はこれに対して一般化されたアプローチを採用しており、大きな成功を収めています。または多分製品はクラッキングの価値がなかった;)


3
FYI暗号化は常にリバーシブルであり、暗号化されたものを読み取ることができなくても役に立たないでしょう。ハッシュは、あなたが考えている「暗号化」の1つの方法です。
サミュエル、

「自分の暗号化方式をロールバックしないでください」というのは、Bruce Scheierからのものだと思います(わかりません)。:あなたはこの答えを見ていたいかもしれsecurity.stackexchange.com/questions/2202/...
Shadok

「..P / Invoke to it」について詳しく教えてください。リンクされたページを見てみましたが、うまく
いき

11

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文字列が到着すると、公開鍵によって検証(==復号化)され、有効であることが判明した場合、製品がアクティブ化されます。


8

それが取るに​​足らないことでも、難しいことでも、それが本当に大きな違いをもたらすかどうかはわかりません。

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

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


6

私はかなり異常なことをするだろうと認めなければなりません。

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

彼らがLicenseCheckを見つけて削除すると、DLLがセグメンテーション違反を開始するときにどのような楽しみが続きます。


その後、DEPを無効にする必要はありませんか?
Rowland Shaw、

いいえ。PAGE_EXECUTE_READWRITEを設定することは、文書に記載されている自己変更コードを記述する正しい方法であり、そのページのNXビットのみをクリアします。
ジョシュア

8
この一般的な手法は、80年代後半に非常に人気がありました。その弱点は、「秘密の」コードがRAMに復号化されるため、実行中のソフトウェアのコピーから簡単に盗むことができることです。
レイバーンズ

5

マイクロソフトソフトウェアライセンスおよび保護(SLP)サービスのオプションもあります。それについて読んだ後、私は本当にそれが使えることを望みます。

ライセンスに基づいてコードの一部をブロックするというアイデアが本当に気に入っています。ホットなものであり、.NETにとって最も安全です。使わなくても面白い読み物!

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

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


キャンセルされたことを覚えている人のために:SLPが再び再起動されます
Michael Olesen

5

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


2

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


2

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

C#で次のコードを使用しますSystem.Guid.NewGuid()

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

お役に立てば幸いです。


1

トリックは、あなただけが知っているアルゴリズムを持っていることです(反対側でデコードできるように)。

「素数を選び、それに魔法の数を加える」のような単純なものがあります

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

またに対する応答を読む価値があるかもしれない、この質問にも


6
「秘訣は、あなただけが知っているアルゴリズムを持つことです」-これは、あいまいさによるセキュリティの定義であり、本当に悪い考えです。
Nick Johnson、

3
すべてのライセンスは、秘密を含むアルゴリズムによるものです。多くの場合、ライセンス供与は、「壊れない」鍵を生み出すという軍拡競争よりも、弁護士への投資が最も効果的です
Rowland Shaw

法的手段によるライセンス執行に関するコメントへの+1
Rob

はい、DRMと同様に、すべてのライセンスは脆弱です。ただし、秘密のアルゴリズムに依存することは明らかに弱いです。
Nick Johnson、

1
私はあなたに良い答えのために+1を与えました、そして私があなたに反対投票に反対するもう一つも与えたいと思います。悲しいことに、世界にはいくつかの非常に未熟な小さな赤ちゃんがいます。
ProfK、2011

1

いくつかのツールとそれに利用できるAPIがあります。ただし、無料で入手できるとは思いません;)

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


0

LicenseSpotを確認できます。それは提供します:

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

1
「無料」は本当に無料ではありません。アプリにライセンスコンポーネントを埋め込むことは無料です。アプリが実際にライセンスコンポーネントを使用するのは無料ではありません。10回のアクティベーションを超えると、月額料金を支払う必要があります。アクティベーションごとの割合ではありません。低ボリューム、低コストの.NETアプリの場合、この価格モデルは不利になります。.NETアプリ用のApple AppStoreとは異なります。
Cheeso

0

@frankodwyerの素晴らしい答えに少し触れて、オンラインベースのライセンスについてもう少し詳しく説明します。私は、開発者向けに作成されたライセンスREST API であるKeygenの創設者です。

アプリケーションに2つの「タイプ」のライセンス、つまり「フルバージョン」と「トライアルバージョン」が必要であるとおっしゃっていたので、これを簡略化して、アプリケーションの特定の機能をライセンスする機能ライセンスモデルを使用できます(この場合、 「完全な」機能セットと「試用」機能セットがあります)。

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

さらに、ユーザーがアプリを購入するたびに(PayPal、Stripeなどを使用しているかどうかにかかわらず)、「フル」機能ポリシーを実装するライセンスを生成し、それをユーザーのアカウントに関連付けることができます。これで、アプリ内で、ユーザーがPro-Feature-XおよびPro-Feature-Yを実行できる「フル」ライセンスを持っているかどうかを確認できます(などの方法でuser.HasLicenseFor(FEATURE_POLICY_ID))。

ユーザーがユーザーアカウントを作成できるようにしたが、それはどういう意味ですか。他のいくつかの回答でこれについて詳しく説明しましが、ユーザーを認証および識別するための優れた方法であると私が考える理由について簡単に説明します。

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

あなたがいない場合はもちろん、したいユーザーアカウントを処理するために、あなたがしたい入力ライセンスキーにユーザーを、それは完全に罰金です(とkeygenのの支持体は、同様ということをやって)。私は、ライセンスのその側面を処理する別の方法を提供しており、うまくいけば、顧客に素晴らしいUXを提供できます。

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

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


0

この回答を確認してください: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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.