web-dev-qa-db-ja.com

ソフトウェアライセンスキーを生成して検証する方法

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

そのようなライセンスキーを使うのは普通のことだと思います。

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

私はまた、何らかの形でアプリケーションのバージョンにキーを結び付けるべきだと思います。そうすれば、機能バージョンで新しいキーを請求することが可能になるでしょう。

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

216
Riri

警告:ユーザーが違法コピーするのを防ぐことはできませんが、誠実なユーザーが正しいことをするのを簡単にするだけです。

ユーザーごとに特別なビルドをしたくないとします。

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

しかし、私は繰り返します:これは海賊行為を防ぐことはできません


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

しかし、私は本当にこれに言及すべきだと思った。あなたがこれから何か他のものを引き出すことを計画しているなら、注意してください。

119

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

理想的には、ライセンスキーに次のプロパティを持たせることをお勧めします。

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

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

  3. ライセンスキーは短く、電話で入力または入力が簡単である必要があります。キーに "l"または "1"が含まれているかどうかがわからないため、すべての顧客がテクニカルサポートに電話することは望ましくありません。あなたのサポート部門はこれに感謝します、そしてあなたはこの分野でより低いコストを持つでしょう。

それで、あなたはどのようにこれらの挑戦を解決しますか?

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

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

  3. キーから「1」、「l」、「0」、「o」のような余分な文字を削除するだけです。ライセンスキー文字列を文字のグループに分割します。

82
Catalin S.

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

ハッカーは関係なくそれをクラックするので、ハッカーを防ぐためのシステムで誠実な顧客を罰してはいけません。

彼らの電子メールまたは同様のものに結び付けられた単純なハッシュコードはおそらく十分に良いでしょう。ハードウェアベースのIDは、人々がハードウェアを再インストールまたは更新する必要があるときに常に問題になります。

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

71
schooner

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

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

53
shoosh

すでに述べたことのほかに....

中間言語の問題のため、.NETアプリケーションを使用することは本質的に壊れやすいものです。 .NETコードを単純に分解するだけで、あなたの製品は誰にでも公開されます。その時点で彼らは簡単にあなたのライセンスコードを迂回することができます。

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

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

あなたの製品が複雑であるならば、固有のサポート問題はあなたのためにいくらかの保護をつくります。

22
Brant Herrett

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

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

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

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

11
gb2d

私はこれまで Crypkey を使っていました。それは利用できる多くのうちの1つです。

ソフトウェアを保護することができるのは、任意のライセンス方式でのみ可能です。

6
Mitch Wheat

私はあなたがどのくらい精巧に手に入れたいのかわかりません

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

あなたはプログラムにあなたとそれに何かエールを送るようにさせることができます(nicのユーザー名とMACアドレスのように)

それに基づいてコードを計算し、それらをキーで電子メールで送り返します。

彼らは彼らが鍵を手に入れた後に彼らが機械を切り替えるのを防ぎます。

6
Crash893

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

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

4
Marius

私の会社のソフトウェア(C#.net)にインターネットベースのワンタイムアクティベーションを実装しました。これには、サーバーのデータベースに保存されているライセンスを参照するライセンスキーが必要です。ソフトウェアはサーバーにキーを打つとライセンス情報を与えられ、クライアントコンピュータ上のいくつかの変数(CPUIDとその他の頻繁に変わることのないもの)から生成されたRSAキーを使ってローカルに暗号化されます。レジストリ.

それはいくらかのサーバーサイドのコーディングを必要とします、しかしそれは私たちにとって本当にうまくいっていて、私たちがブラウザベースのソフトウェアに拡張したとき私は同じシステムを使うことができました。それはまた、誰が、どこで、そしていつソフトウェアが使用されているかについてのあなたの販売員にすばらしい情報を与えます。ローカルでのみ処理されるライセンスシステムは、悪用に対して完全に脆弱です。特に.NETでの反省。しかし、他のすべての人が言っているように、システム全体が安全というわけではありません。

私の考えでは、Webベースのライセンスを使用していないのであれば、ソフトウェアを保護することには意味がありません。 DRMが引き起こす可能性がある頭痛で、それが実際にそれに苦しむために支払ったユーザーに公平ではないです。

4
jugg1es

私は Cryptolens ソフトウェアライセンスプラットフォームの開発者の一人で、14歳からライセンスシステムの開発に取り組んできました。この回答では、長年の経験に基づいたヒントをいくつか紹介しました。

これを解決する最善の方法は、アプリケーションの各インスタンスがライセンスキーを検証するために呼び出すライセンスキーサーバーを設定することです。

ライセンスキーサーバーの利点

ライセンスキーサーバーの利点は次のとおりです。

  1. すぐに有効になり、いつでもライセンスキーを更新またはブロックできます。
  2. 各ライセンスキーは特定の数のコンピュータにロックできます(これにより、他のユーザーが使用するためにユーザーがライセンスキーをオンラインで公開できなくなります)。

検討事項

オンラインでライセンスを検証すると、アプリケーションの各インスタンスをより細かく制御できますが、インターネット接続が常に存在するわけではありません(特に大企業をターゲットとする場合)。そのため、別の方法でライセンスキーを検証します。

解決策は、RSAやECCなどの公開鍵暗号システムを使用して、サーバーからのライセンスキー応答に常に署名することです(組み込みシステムで実行する予定の場合はおそらくもっと良いです)。アプリケーションには、ライセンスキーの応答を検証するための公開キーのみが必要です。

インターネットに接続できない場合は、代わりに以前のライセンスキーの応答を使用できます。応答に日付マシン識別子の両方を必ず格納してください。そして、それが古すぎないことを確認し(たとえば、ユーザーが最大30日オフラインになることを許可するなど)、ライセンスキーの応答が正しいデバイスに属していることを確認します。

変更されていないことを確認するために、インターネットに接続している場合でも、必ずライセンスキーの証明書を確認してください)サーバーから離れたので(これは、ライセンスキーサーバーに対するAPIがhttpsを使用している場合でも、実行する必要があります)

秘密アルゴリズムの保護

ほとんどの.NETアプリケーションは非常に簡単にリバースエンジニアリングすることができます(ILコードを取得するためにMicrosoftから提供されているdiassemblerと、C#などで市販されている製品でさえ入手可能です)。もちろん、いつでもコードを難読化することができますが、100%安全というわけではありません。

ほとんどの場合、ソフトウェアライセンスソリューションの目的は、誠実な人々が誠実であることを支援することです(つまり、誠意を持って支払いを行うユーザーは、試用期間が終了した後も支払いを忘れないようにするなど)。

しかし、あなたはまだあなたが決して公に漏洩したくないいくつかのコードを持っているかもしれません(例えば、株価を予測するためのアルゴリズムなど)。この場合、実行する唯一の方法は、メソッドを実行するたびにアプリケーションが呼び出すAPIエンドポイントを作成することです。それはインターネット接続を必要としますが、それはあなたの秘密コードがクライアントマシンによって決して実行されないことを保証します。

実装

自分で全部を実装したくないのであれば、 このチュートリアルCryptolens の一部)を見てみることをお勧めします。

4
Artem

他の数人が言及したように、私はデフォルトで顧客に対して敵対的であるという大きな反対者です。これは、ライセンス業界で有名です。そこで、が優れた顧客UXを提供する、あなたの問題に対する適切なソリューションを展開します。

最初に、追加機能のために顧客を「アップグレード」に変換しようとするために使用しているソフトウェアの「限定」バージョンがあると述べました。あなたが探しているのは、製品の機能ライセンスですお客様は、feature-Xまたはfeature-Yのライセンスを購入できます。

Keygen は、このタイプのライセンスを念頭に置いて構築しました。 KeygenはライセンスREST AP​​Iで、ユーザーアカウント、ライセンスの管理、およびマシンの使用/関連付けの追跡を可能にします。

私がやることは、2つライセンスタイプ(Keygen内のpolicy)を設定することです。1つは制限付き無料の基本ポリシーですバージョン、もう1つは有料版のポリシーです。

支払いに何を使用しているかはわかりませんが、webhooksを提供するStripe(最近ではかなり標準的なもの)のようなものを使用していると仮定しましょう。 Keygenにはwebhookもあります(使用するかどうかにかかわらず、これはすべて適用可能です)。 Keygenを統合して、両側のWebhookを使用して支払いプロバイダーと対話できます(customer.created->顧客の基本ライセンスを作成、license.created->顧客に新しいライセンスを請求)。

したがって、webhookを利用することにより、新規顧客のライセンス作成を自動化できます。では、アプリケーション自体内でのライセンス検証についてはどうでしょうか?これはさまざまな方法で行うことができますが、最も一般的な方法は、顧客に入力フィールドに長いライセンスキーを入力してもらい、それを検証できるようにすることです。これは、アプリケーションでライセンス検証を処理するひどい方法だと思います。

なぜそう思うのですか?まず最初に、マシンの消費を目的とする退屈な長いライセンスキーの入力を顧客に要求し、2番目退屈な長いライセンスキーの追跡をあなたと顧客に要求する

さて、代替手段は何ですか?最良の代替手段は、すべての顧客が慣れていることをすることだと思います:メール/パスワードを使用して製品のアカウントを作成することを許可します。その後、すべてのライセンスとマシンをそのアカウントに関連付けることができます。そのため、ライセンスキーを入力する代わりに、資格情報を使用して簡単にログインできます。

それはどのような利点がありますか?まず、あなたとあなたの顧客がライセンスキーを追跡する必要性を取り除きますユーザーアカウント内ですべてバックグラウンドで処理されるため、最も重要なこと:セルフサービスライセンスとマシンのアクティベーションを顧客に提供できるようになりました!つまり、すべてのライセンスとマシンはユーザーアカウントに関連付けられているため、認識されていないマシンでアプリケーションを起動するときにライセンスの購入を促すことができます。

今すぐライセンス検証に進みます:顧客が電子メール/パスワードでアプリケーションにログインするたびに、所有するライセンスのユーザーアカウントを照会して、 feature-Xまたはfeature-Yを使用できます。また、アプリケーションはself-serveであるため、顧客がアプリケーション内から直接追加機能を購入できるようにすることができます!

そのため、ライセンスシステムにtonの自動化を導入し、個々の機能にライセンスを付与することができます(つまり、限定対完全バージョン)、お客様にawesomeUXを提供し、サポートリクエストの最大の理由の1つを軽減しました:license key recovery 。

とにかく、これは長くなりましたが、うまくいけば誰かの助けになります!

3
ezekg

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

過去に、私はTreekのライセンシングライブラリを何度も使ってきました。それはエンドユーザーとそれ自身のために同じライセンス保護を使います、そして今まで誰もそれを解読しませんでした。違法コピーやクラッキングを防ぐために、Webサイトで優れたヒントを見つけることもできます。

3
panpernicek

ソフトウェアの違法コピーを完全に防止することは不可能です。あなたは偶然の違法コピーを防ぐことができます、そしてそれは彼らのうちのすべてのライセンシング解決策です。

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

2
adnan kamili

Quantum-Key.Netなど、無料のサードパーティソリューションを使用してこれを処理することができます。ペイパルを使用して作成されたWeb販売ページで支払いを処理し、電子メールによるキー発行と特定のコンピュータへのキー使用をロックします。海賊行為を防ぐ。

コードを難読化/暗号化するように注意する必要があります。そうしないと、De4dotや.NetReflectorなどのソフトウェアを使用して簡単にリバースエンジニアリングすることができます。優れたフリーコード難読化ツールはConfuserExです。これは速くて使いやすく、高価な代替案よりも効果的です。

De4Dotと.NetReflectorを使って完成したソフトウェアをリバースエンジニアリングし、クラッカーが同じことをした場合にクラッカーが何を見ているかを確認し、重要なコードを公開したり偽装したりしないでください。

あなたのソフトウェアはまだ割れる可能性がありますが、普通のクラッカーにとってはそれらを延期するのに十分かもしれません、そしてこれらの単純なステップはあなたのコードが抽出され再利用されるのも防ぎます。

https://quantum-key.net

ConfuserExの使い方は?

https://github.com/0xd4d/de4dot

https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download

0
Damo