272

私は現在、無料でダウンロードおよびインストールできる製品 (C# で開発) の開発に携わっていますが、バージョンは非常に限定されています。ユーザーがすべての機能にアクセスするには、ライセンス料を支払い、キーを受け取る必要があります。その後、そのキーがアプリケーションに入力され、フル バージョンの「ロックが解除」されます。

そのようなライセンスキーを使用するのは普通のことなので、私は疑問に思っています:

  1. それは通常どのように解決されますか?
  2. キーを生成するにはどうすればよいですか? また、アプリケーションでキーを検証するにはどうすればよいですか?
  3. また、キーがインターネット上で公開され、ライセンスを支払っていない他のユーザー (基本的に「自分のもの」ではないキー) によって使用されることを回避するにはどうすればよいでしょうか。

また、機能バージョンで新しいキーを請求できるように、何らかの方法でキーをアプリケーションのバージョンに関連付ける必要があると思います。

このシナリオで他に考えるべきことはありますか?

4

15 に答える 15

137

注意: ユーザーの著作権侵害を防ぐことはできませんが、正直なユーザーが正しいことをしやすくなるだけです。

ユーザーごとに特別なビルドを行いたくない場合、次のようになります。

  • 製品の秘密鍵を自分で生成します
  • ユーザーの名前を取る
  • ユーザー名と秘密鍵を連結し、(たとえば) SHA1 でハッシュします。
  • SHA1 ハッシュを英数字文字列として展開します。これは、個々のユーザーの「プロダクト キー」です。
  • プログラム内で、同じハッシュを行い、プロダクト キーと比較します。等しければOK。

しかし、繰り返しますが、これでは著作権侵害を防ぐことはできません


私は最近、このアプローチが暗号学的にあまり健全ではないことを読みました。しかし、このソリューションはすでに脆弱です (ソフトウェア自体が秘密鍵をどこかに含める必要があるため)。そのため、この発見によってソリューションが無効になるとは思いません。

ただし、これについては本当に言及する必要があると思いました。これから何か他のものを導き出すことを計画している場合は、注意してください。

于 2009-03-01T13:53:08.153 に答える
124

ライセンス キーを生成する方法は多数ありますが、本当に安全な方法はほとんどありません。企業にとって、ライセンスキーは実際の現金とほぼ同じ価値があるため、残念です。

理想的には、ライセンス キーに次のプロパティが必要です。

  1. 誰かがあなたの製品を完全にリバースエンジニアリングしたとしても、あなたの会社だけがあなたの製品のライセンスキーを生成できるべきです(私は経験から話します)。アルゴリズムを難読化したり、ソフトウェア内に暗号化キーを隠したりすることは、ライセンスの管理に真剣に取り組んでいる場合、本当に問題外です。あなたの製品が成功すれば、リリースから数日で誰かがキージェネレーターを作るでしょう。

  2. ライセンス キーは 1 台のコンピューターでのみ使用できる必要があります (または、少なくともこれを非常に厳密に制御できる必要があります)。

  3. ライセンス キーは短く、電話で簡単に入力または口述できる必要があります。キーに「l」が含まれているのか「1」が含まれているのか理解できないという理由で、すべての顧客がテクニカル サポートに電話する必要はありません。サポート部門はこれに感謝し、この分野でのコストを削減できます。

では、これらの課題をどのように解決しますか?

  1. 答えは簡単ですが、技術的に難しいものです。それは、公開鍵暗号を使用したデジタル署名です。実際、ライセンス キーは、会社の秘密鍵で署名された、いくつかの有用なデータを含む署名済みの「ドキュメント」である必要があります。署名はライセンス キーの一部である必要があります。製品は、対応する公開キーを使用してライセンス キーを検証する必要があります。この方法では、誰かが製品のロジックに完全にアクセスできる場合でも、秘密キーを持っていないため、ライセンス キーを生成できません。ライセンス キーは次のようになります。 BASE32(CONCAT(DATA, PRIVATE_KEY_ENCRYPTED(HASH(DATA)))) ここでの最大の課題は、従来の公開キー アルゴリズムの署名サイズが大きいことです。RSA512 には 1024 ビットの署名があります。ライセンス キーに何百もの文字を使用したくありません。最も強力なアプローチの 1 つは、楕円曲線暗号を使用することです (既存の特許を回避するために慎重に実装します)。ECC キーは RSA キーの 6 分の 1 で、強度は同じです。Schnorr デジタル署名アルゴリズムのようなアルゴリズムを使用して、署名サイズをさらに縮小できます (2008 年に特許が期限切れになりました - 良い :) )

  2. これは、製品のアクティベーションによって実現できます (Windows が良い例です)。基本的に、有効なライセンス キーをお持ちのお客様は、「アクティベーション データ」を生成する必要があります。これは、コンピュータのハードウェア ID を署名付きデータとして埋め込んだ署名付きメッセージです。通常、これはインターネット経由で行われますが、1 回だけです。製品がライセンス キーとコンピュータ ハードウェア ID をアクティベーション サーバーに送信し、アクティベーション サーバーが署名付きメッセージを返信します (これは、短く簡単に口述することもできます)。電話)。その瞬間から、製品は起動時にライセンス キーをチェックしませんが、有効化データを確認します。これは、検証するためにコンピューターが同じである必要があります (そうでない場合、データが異なり、デジタル署名が検証されません)。

  3. 「1」、「l」、「0」、「o」などの冗長な文字をキーから削除してください。ライセンス キー文字列を文字のグループに分割します。

于 2011-11-16T10:23:06.223 に答える
81

簡単な答え - どのスキームを使用してもクラックされる可能性があります。

ハッカーはハッカーに関係なくクラックされるため、ハッカーを防ぐことを目的としたシステムで正直な顧客を罰しないでください。

メールなどに関連付けられた単純なハッシュ化されたコードで十分でしょう。ハードウェア ベースの ID は、ハードウェアを再インストールまたは更新する必要がある場合に常に問題になります。

この問題に関する良いスレッド: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34

于 2009-03-01T13:45:51.743 に答える
61

キーを生成するときは、ハッシュを計算する文字列にバージョンとビルド番号を連結することを忘れないでください。そうすれば、これまでにリリースしたすべてのもののロックを解除する単一のキーはありません.

astalavista.box.skにいくつかのキーやパッチが浮かんでいるのを見つけたら、誰かがクラックするのに十分なほど人気のあるものを作ることに成功したことがわかります。喜ぶ!

于 2009-03-01T14:06:30.273 に答える
25

すでに述べたことに加えて....

.NETアプリケーションの使用は、中間言語の問題のために本質的に壊れやすいものです。.NETコードを逆アセンブルするだけで、誰でも製品を利用できるようになります。その時点で、ライセンスコードを簡単にバイパスできます。

ハードウェア値を使用してキーを作成することさえできなくなりました。仮想マシンでは、誰かが「ライセンスされた」マシンのイメージを作成し、選択した任意のプラットフォームで実行できるようになりました。

高価なソフトウェアの場合は、他の解決策があります。そうでない場合は、カジュアルなハッカーにとって十分に難しいものにします。そして、最終的にはライセンスのないコピーが出てくるという事実を受け入れてください。

製品が複雑な場合、固有のサポートの問題により、ある程度の保護が作成されます。

于 2009-03-01T17:56:06.680 に答える
11

ライセンス キーの生成に使用する C# / .NET エンジンは現在、オープン ソースとして維持されています。

https://github.com/appsoftware/.NET-Licence-Key-Generator .

これは、キーの生成に使用するキーのサブセットのみを配布可能ファイルにコンパイルする必要があることを意味する「部分キー検証」システムに基づいています。キーは自分で作成するため、ライセンスの実装はソフトウェアに固有です。

前述のように、コードを逆コンパイルできる場合、ほとんどのライセンス システムを比較的簡単に回避できます。

于 2013-05-09T21:21:57.107 に答える
6

私は過去にCrypkeyを使用しました。これは、利用可能な多くの 1 つです。

ソフトウェアを保護できるのは、どのライセンス スキームでも、ある程度までです。

于 2009-03-01T13:43:57.490 に答える
6

どこまで細かくしたいのかわからない

しかし、.net はハード ドライブのシリアル番号にアクセスできると思います。

you could have the program send you that and something eles ( like user name and mac address of the nic)

you compute a code based off that and email them back the key.

they will keep them from switching machines after they have the key.

于 2009-03-01T17:11:39.567 に答える
4

あなたが求めたすべてを行う唯一の方法は、インターネットアクセスとサーバーでの検証を要求することです. アプリケーションは、キーを使用してサーバーにサインインする必要があります。次に、IP アドレスなどのセッションの詳細を保存する必要があります。これにより、キーが複数の異なるマシンで使用されるのを防ぐことができます。これは通常、アプリケーションのユーザーにはあまり人気がなく、非常に高価で複雑なアプリケーションでない限り、価値がありません。

アプリケーションのライセンス キーを取得し、クライアント側でキーが適切かどうかを確認することもできますが、このキーを他のユーザーに配布するのは簡単で、逆コンパイラを使用して新しいキーを生成することもできます。

于 2009-03-01T13:46:59.447 に答える
4

ライセンス生成に必要な重要な情報をソースコードに含める必要がないため、ここでは公開鍵暗号ベースのライセンス システムのみが適切なアプローチであると強く信じています。

以前、私はTreek の Licensing Libraryを何度も使用しました。これは、この要件を満たし、非常に手頃な価格であるためです。エンドユーザーとそれ自体に同じライセンス保護を使用しており、今まで誰もそれを解読していません. 著作権侵害やクラッキングを回避するためのヒントもウェブサイトで見つけることができます。

于 2015-01-08T07:01:24.257 に答える
2

ソフトウェアの著作権侵害を完全に防ぐことはできません。カジュアルな著作権侵害を防ぐことができます。これは、すべてのライセンス ソリューションが行っていることです。

ライセンス キーの再利用を防ぎたい場合は、ノード (マシン) ロック ライセンスが最適です。私は自分のソフトウェアにCryptlexを約 1 年間使用しています。無料プランもあるので、あまり集客を期待しなければ無料で利用できます。

于 2016-01-31T19:04:50.940 に答える