94

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

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

関連している:

4

14 に答える 14

83

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

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

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

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

キーを忘れたユーザーへの対応などのサポート コストも考慮してください。

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

于 2009-01-17T09:54:06.667 に答える
16

あなたは誰を信頼しますか?

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

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

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

次に、それらのチェックサムをすべてチェックし、必要な(可逆的な)暗号化を追加して、クラックを困難にします.

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

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

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

于 2009-01-17T10:21:37.127 に答える
11

Windows プロダクト キーなど、入力できるキーについて質問している場合は、いくつかのチェックに基づいています。コピーして貼り付ける必要があるキーについて話している場合、それらはデジタル署名 (秘密キー暗号化) に基づいています。

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

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

于 2009-01-18T04:50:40.880 に答える
10

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

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

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

于 2009-01-17T14:59:40.810 に答える
6

私はかなり狂ったことをしたことを認めなければなりません。

  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 がセグメンテーション フォールトを開始したときの楽しみが続きます。

于 2009-01-18T06:26:12.840 に答える
5

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

于 2009-12-12T11:32:25.713 に答える
5

オプションのMicrosoft Software Licensing and Protection (SLP) Services もあります。それについて読んだ後、私は本当にそれを使用したいと思います。

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

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

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

于 2009-01-18T04:53:58.330 に答える
2

簡単な方法の 1 つは、Globally Unique Identifier (GUID) を使用することです。通常、GUID は 128 ビット値として格納され、通常は{21EC2020-3AEA-4069-A2DD-08002B30309D}.

C# by で次のコードを使用します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 "/".

お役に立てば幸いです。

于 2014-06-04T16:32:59.620 に答える
2

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

于 2010-03-19T20:32:04.443 に答える
1

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

「素数を選んでそれにマジックナンバーを足す」みたいな簡単なものもある

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

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

于 2009-01-17T09:24:22.077 に答える
1

いくつかのツールと API が利用可能です。ただし、無料で見つかるとは思いません ;)

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

于 2009-01-17T09:25:51.933 に答える
1

この回答を確認してください: 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();
于 2016-07-26T19:22:31.753 に答える
0

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

  • 無料ライセンス コンポーネント
  • オンラインアクティベーション
  • アプリとオンライン ストアを統合するための API
  • シリアル番号の生成
  • ライセンスを取り消す
  • サブスクリプション管理
于 2011-03-11T15:20:53.183 に答える