ソフトウェアライセンスキーはどのように生成されますか?


361

ライセンスキーは、著作権侵害対策としての事実上の標準です。正直なところ、これは私に(in)Security Through Obscurityのように感じますが、ライセンスキーがどのように生成されるのかは本当にわかりません。ライセンスキー生成の良い(安全な)例は何ですか?彼らが使用している暗号プリミティブ(ある場合)は何ですか?メッセージダイジェストですか?もしそうなら、彼らはどのデータをハッシュするでしょうか?クラッカーが独自の鍵ジェネレータを作成するのを困難にするために、開発者はどのような方法を採用していますか?キージェネレータはどのように作られていますか?


8
興味深い質問を1つ増やしてください。回答者は、このトピックに関するいくつかの優れたリソースへのリンクを投稿して、さらに読むことができますか?:)
Jacob

44
プログラムの実行に必要なすべてのコードとデータがユーザーに提供されているため、すべてのDRMスキームは基本的にあいまいなスキームです。このスキームは任意に難読化してパッチ適用を困難にすることができますが、コードにパッチを適用してチェックを回避できることは確実です。
ca

5
CDキーは確かにあいまいなため、セキュリティです。それらを構築する方法はいくつかありますが、すべては、鍵を検証するために必要なプログラムに何らかの秘密を埋め込むことに依存しています。
Nick Johnson

4
現在、それらはプロダクトキーまたはライセンスキーと呼ばれています。これらを使用するほとんどのソフトウェアは、CDよりもオンラインで配信される可能性が高いためです。
Joel Coehoorn、2010年

4
いつかこのような幼年期の夢を心配しなくてはならないアプリを作りたいと思っています。Webアプリはそれを切りません。
Znarkus、2010年

回答:


268

古い学校のCDキーの場合、それは、どのCDキー(任意の文字列でもかまいません)の生成と検証が簡単なアルゴリズムを作成するだけの問題でしたが、有効なCDキーと無効なCDキーの比率-keysは非常に小さいので、CDキーをランダムに推測しても、有効なキーを取得することはできません。

正しくない方法:

StarcraftHalf-lifeはどちらも同じチェックサムを使用し、13桁目は最初の12桁を検証しました。したがって、最初の12桁には何でも入力でき、13桁目(10の可能性しかない)を推測できます。1234-56789-1234

検証のアルゴリズムは公開されており、次のようになります。

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

それを行うための正しい方法

Windows XPはかなりの量の情報を受け取り、それを暗号化し、文字/数字のエンコーディングをステッカーに貼ります。これにより、MSはキー確認する同時に製品タイプ(Home、Professionalなど)を取得することができました。さらに、オンラインでのアクティベーションが必要です。
完全なアルゴリズムはかなり複雑ですが、ドイツで発行されたこの(完全に合法な)論文でうまく概説されています。

あなたは(のようなオンラインサービス提供されていない限り、もちろん、あなたが何をすべきかに関係なくは、World of Warcraftのを)、コピープロテクトの任意のタイプは、ちょうどストールです:それはすべてのゲームの価値が値だ場合、残念ながら、誰かが解除されます(または少なくとも回避で) CDキーアルゴリズム、およびその他すべての著作権保護。

それを行うための実際の正しい方法:

オンラインサービスの場合、バイナリファイルを使用する場合でもサーバーで認証する必要があるため(WoWアカウントを持っているなど)、人生は少し単純になります。World of WarcraftのCDキーアルゴリズム-たとえば、プレイタイムカードを購入するときに使用-は、おそらく次のようになります。

  1. 非常に大きな暗号で保護された乱数を生成します。
  2. データベースに保存して、カードに印刷します。

    次に、誰かがプレイタイムカード番号を入力したら、それがデータベースにあるかどうかを確認し、ある場合は、その番号を現在のユーザーに関連付けて、再度使用できないようにします。

オンラインサービスの場合、上記のスキームを使用しない理由はありません。それ以外のものを使用すると、問題が発生する可能性があります


47
Mathematicaには興味深いプロセスがあります。製品には一意のキーが付属しており、インストールファイルは2番目の一意のキーを生成します(ハードウェアに基づく)。これらのキーは両方とも、名前と登録情報を含むオンラインフォームに入力する必要があります。その後、2つのキーに基づいて、実際にソフトウェアをアンロックする実際のキーを送信しますが、その特定のプロダクトキーと特定のハードウェアのみが対象です。
Dan

18
えっと、Starcraftの1234-56789-1234キーについては知りませんでしたが、キーパッドをマッシュして再試行することで検証者を「ブルートフォース」するのに約5分しかかからなかったことを覚えています。
fmark

18
また、111-1111111を有効なcdkeyとして使用できるMicrosoft製品(Visual Studio 6.0)も過去にいくつか覚えています
hannson

25
1234-56789-1234を知りませんでした。代わりに、13を使用しました!3333333333333
ErikTJ

33
オンラインでのアクティベーションの問題は、出版社が廃業した場合に、私たち全員が困惑していることです。これを行わないでください。これは起こり、いつの日かマイクロソフトにも起こり得ます。
Brad

56

私が最初にこの回答を書いたとき、それはライセンスキーの「オフライン」検証に関する質問であるという仮定の下でした。他のほとんどの回答はオンライン検証に対応しています。これは処理が大幅に簡単です(ほとんどのロジックはサーバー側で実行できます)。

オフライン検証で最も難しいのは、膨大な数の一意のライセンスキーを生成し、簡単に侵害されない強力なアルゴリズム(単純なチェックデジットなど)を維持できるようにすることです。

私は数学にはあまり詳しくありませんが、これを行う1つの方法は、グラフをプロットする数学関数を使用することです

プロットされた線は、(十分に細かい周波数を使用する場合)数千の一意のポイントを持つことができるため、そのグラフでランダムなポイントを選択し、何らかの方法で値をエンコードすることでキーを生成できます

ここに画像の説明を入力してください

例として、このグラフをプロットし、4つのポイントを選択して、「0、-500; 100、-300; 200、-100; 100,600」として文字列にエンコードします

文字列を既知の固定キー(非常に弱いが目的にかなう)で暗号化し、結果のバイトをBase32で変換して最終的なキーを生成します

次に、アプリケーションはこのプロセスを逆にして(base32から実数、ポイントを復号化、デコード)、それらの各ポイントがシークレットグラフ上にあることを確認します。

非常に少量のコードにより、膨大な数の一意で有効なキーを生成できます。

しかし、それはあいまいさによる非常にセキュリティです。時間をかけてコードを逆アセンブルする人なら誰でもグラフ作成関数と暗号化キーを見つけて、キージェネレーターをモックアップできますが、おそらく海賊行為の速度を落とすのに非常に役立ちます。


6
いいえ、エリックはそうしません。Xは整数で、Yは関数のフロアです。
ジョシュア

これは、以前のGPS以前の衛星ナビゲーションが機能していた方法と同じです。 youtube.com/watch?v=BBOsQBuCJfs
ブラッド

34

次の要件をカバーする部分キー検証に関するこの記事を確認してください。

  • ライセンスキーは、入力するのに十分簡単でなければなりません。

  • チャージバックや盗まれたクレジットカードでの購入の場合は、ライセンスキーをブラックリストに登録(取り消す)できる必要があります。

  • キーをテストするための「電話ホーム」はありません。この習慣はますます広まっていますが、私はまだユーザーとしてそれを認めていないので、ユーザーにそれを我慢するよう求めません。

  • クラッカーがリリースされたアプリケーションを分解して、そこから動作する「keygen」を生成することは不可能であるべきです。これは、アプリケーションが検証用のキーを完全にテストしないことを意味します。いくつかのキーのみがテストされます。さらに、アプリケーションの各リリースでは、キーの異なる部分をテストする必要があるため、以前のリリースに基づく偽のキーは、ソフトウェアの新しいリリースでは機能しません。

  • 重要:正規のユーザーが無効になっているキーを誤って入力して、機能しているように見えても、入力ミスのために将来のバージョンで失敗することはありません。


21

私は実際にCDキーを生成するために人々が何をするかについての経験はありませんが、(オンラインアクティベーションの道を進みたくないと想定している場合)キーを作成する方法はいくつかあります。

  • 数が(たとえば)17で割り切れる必要があります。多くのキーにアクセスできても、潜在的な文字列の大部分が無効になる場合は、簡単に推測できます。同様に、キーのチェックサムが既知の値と一致する必要があります。

  • キーの前半を既知の値と連結した場合、キーの後半までハッシュする必要があります。優れていますが、プログラムには、キーの生成と検証に必要なすべての情報が含まれています。

  • 既知の値+ nonceを(秘密鍵で)暗号化して鍵を生成します。これは、対応する公開鍵を使用して復号化し、既知の値を確認することで確認できます。これで、プログラムは、キーを生成できなくてもキーを検証するのに十分な情報を取得しました。

これらはすべて攻撃の余地があります。プログラムはまだ存在しており、パッチを適用してチェックをバイパスできます。賢いのは、プログラムに値を保存するのではなく、3番目の方法からの既知の値を使用してプログラムの一部を暗号化することです。この方法では、プログラムを解読する前にキーのコピーを見つける必要がありますが、解読後にコピーされ、1人の人が合法的なコピーを取得し、それを使用して他のすべてのユーザーがソフトウェアにアクセスできるようにする脆弱性があります。


9
誰かが暗号化を提案するたびに私を笑わせるエヘム否定的な意味合いを考えると、「一度使用された数」のことを名前にNonceを選択しなかった人は本当に望みます。
エドジェームス

2
3番目のオプションは対称キー暗号では機能しないことに注意してください。これは、攻撃者がプレーンテキストのテストをリバースエンジニアリングし、通過するものを生成して、(既知の)キーと(既知の)暗号で暗号化するためです。自作のサイファーを使用することは解決策ではありません。自分でそれを正しく実行できる場合は、NSAに就職する必要があるためです。
BCS

@BCS:申し訳ありませんが、公開鍵暗号の使用についてはもっと明確になっているはずです。
Andrew Aylett、2010年

公開鍵バージョンの暗号化スキームではなく、署名スキームを使用します。(RSA署名は「公開鍵による暗号化」に少し似ていますが、まったく同じものではありません
。DSAの

公開鍵暗号の問題は、鍵(およびシリアル)が長くなければならないことです。512ビットのRSAキーペアは、最近解読するのは難しくありません。で入力するだけで128エントロピーのビットが、それでも痛みを持っているのWinXPのキー(5つの文字の英数字の5グループ)と比較してください。
finnw

17

CDキーは、ネットワークに接続されていないもののセキュリティとしてはそれほど重要ではないため、技術的には安全に生成する必要はありません。.netを使用している場合は、Guid.NewGuid()でほとんど問題ありません。

最近の主な用途は、サーバーがCDキーを確認できるマルチプレーヤーコンポーネントです。そのため、「渡されたものをすべて検索し、他の誰かがすでに使用しているかどうかを確認する」ことになるため、安全に生成されたことは重要ではありません。

そうは言っても、アルゴリズムを使用して2つの目標を達成することができます。

  • 何らかのチェックサムを用意してください。これにより、インストーラーはタイプミスを検出するためだけに「キーが有効ではないようです」というメッセージを表示できます(インストーラーにこのようなチェックを追加することは、ハッカーが必要なすべてのコードを持っているため、キージェネレーターを書くのは簡単です。チェックし、サーバー側の検証のみに依存すると、そのチェックが無効になります。これは、タイプミスを認識していないためにサーバーがCDキーを受け入れない理由を理解していない法人顧客に迷惑をかけるリスクがあるためです)
  • 限られた文字のサブセットで作業します。CDキーを入力して、「これは8かBですか?1かIですか?QかOか0ですか?」-曖昧でない文字/数字のサブセットを使用することで、その混乱を排除します。

そうは言っても、海賊が有効なキー(データベースでは有効であるが、まだ店の棚のボックスにある)を単純に推測し、そのボックスを購入した正当な顧客を騙すことを回避するために、大きな分布とある程度のランダム性が依然として必要です。 。


優れたカスタマーサービスで簡単に解決-ボックスショット+購入証明=違法ユーザーをロックし、2番目のユーザーにアクセス権を付与します。
alexanderpas 2010年

1
ここに、CDキーに関するいくつかの追加の考えがありますcodinghorror.com/blog/2007/12/software-registration-keys.html
Richard Chambers

10

鍵の長さに特に関心がない場合は、公開鍵と秘密鍵の暗号化を使用することが、かなり真剣に試みられています。

基本的に、ある種のナンスと固定された署名があります。

例:0001-123456789

0001はナンス、123456789は固定署名です。

次に、秘密鍵を使用してこれを暗号化し、次のようなCD鍵を取得します。ABCDEF9876543210

次に、公開鍵をアプリケーションと一緒に配布します。公開鍵を使用してCD鍵「ABCDEF9876543210」を復号化し、その固定署名部分を検証できます。

これにより、秘密鍵がないため、誰かがナンス0002のCDキーが何であるかを推測できないようになります。

唯一の大きな欠点は、1024ビットのサイズの秘密/公開キーを使用すると、CDキーが非常に長くなることです。ささいな量の情報を暗号化しないように、十分に長いnonceを選択する必要もあります。

利点は、この方法は「アクティベーション」なしで機能し、メールアドレスやライセンシー名などをナンスとして使用できることです。


1
私の例では、キーの長さを大幅に過小評価していることに注意してください。これらのスキームは通常、base64エンコードとコピー/貼り付けの展開を必要としますが、マシンに関連付けられておらず、アクティベーションを必要としないキーを推測することはほぼ不可能です(多くのタイプの顧客にとって2つの重要
事項

3
RSAを使用する代わりに、楕円曲線を使用できます。それらはより短いキーを使用し、それらのブロック長はより短いです。Wikiを読むと、256ビットのECCはAES 128と同じくらい安全なようです
。– xanatos

デジタル署名と「秘密鍵による暗号化」は同じものではないことに注意してください。RSAでは、パディングスキームが異なるため、RSAは似ていますが、他の署名スキームには、対応する暗号化スキームすらありません。
パウロEbermann

@ xanatos、256ビットはまだ手で入力するには長すぎます。WinXPで使用される25文字のキーを考えてみてください-それらは128ビットのエントロピーしか持っていません。
finnw 2012

1
@Mark-署名は通常、単に暗号化されたハッシュです。暗号化または署名を使用できます。私の方法は同じように機能します。秘密鍵なしでは簡単に生成できず、公開鍵で検証できるライセンスキーを作成しようとしているだけです。これは、暗号化されたメッセージ全体(およびその内容の一部が何らかの魔法と一致していることを確認)または単に署名されたメッセージ(および署名が有効であることを確認)である可能性があります。それはあなたの実装次第です。
userx

9

キーシステムには、いくつかのプロパティが必要です。

  • 有効なキーはほとんどありません
  • 有効なキーは、ユーザーが持っているすべてのものを与えられても、派生可能であってはなりません。
  • あるシステムの有効なキーが別のシステムの有効なキーではありません。
  • その他

これらを提供する1つの解決策は、公開鍵署名方式を使用することです。「システムハッシュ」で開始します(たとえば、任意のNICでMacを取得し、並べ替えて、CPU-ID情報に加えて他のいくつかの情報を取得し、それらをすべて連結して、結果のMD5を取得します(実際には、する必要がない場合は、個人を特定できる情報を処理します))CDのシリアル番号を追加し、レジストリキー(またはデータファイル)にblobの有効な署名がない限り、起動を拒否します。ユーザーがblobを送付してプログラムをアクティブにし、署名を送り返します。

潜在的な問題には、実質的に何にでも署名することを提案しているため、誰かが選択されたプレーンテキスト攻撃および/または選択された暗号文攻撃を実行すると想定する必要があります。これは、提供されたシリアル番号をチェックし、無効なリクエストからのリクエストを処理することを拒否すること、および一定の間隔で特定のs / nからの特定の数を超えるクエリを処理することを拒否することで軽減できます(たとえば、年に2回)。

いくつかの点を指摘しておきます。まず、熟練した断固とした攻撃者は、無制限にアクセスできる部分(つまり、CD上のすべて)のあらゆるセキュリティをバイパスすることができます。そのアカウントで実行できる最善の方法は、正当なアクセスを取得するよりも、不正なアクセスを取得することを困難にします。第二に、私は専門家ではないので、この提案されたスキームには深刻な欠陥があるかもしれません。


1

プロセスに複数のステップを組み込んだDRM動作もあります。最もよく知られている例の1つは、Creative Suiteのインストールを確認するためのAdobeの方法の1つです。ここで説明されている従来のCDキー方式が使用され、次にアドビのサポートラインが呼び出されます。CDキーはアドビの担当者に渡され、ユーザーが使用するアクティベーション番号を返します。

ただし、これはステップに分割されていますが、通常のプロセスで使用されるのと同じクラッキング方法の犠牲になります。元のCDキーに対してチェックされるアクティベーションキーを作成するために使用されるプロセスはすぐに発見され、両方のキーを組み込むジェネレーターが作成されました。

ただし、この方法は、インターネットに接続していないユーザーが製品を確認する方法としてまだ存在しています。今後、インターネットアクセスが普及すると、これらの方法がどのように排除されるかは簡単にわかります。


1

すべてのCDは、保護アルゴリズムをコピーするだけであり、正直なユーザーに不便を与える一方、著作権侵害に対する保護は一切提供しません。

「海賊」は1つの正当なCDとそのアクセスコードにアクセスする必要があるだけで、n個のコピーを作成して配布できます。

暗号で安全にコードを作成することは問題ではありません。これをCDにプレーンテキストで提供する必要があります。そうしないと、正規のユーザーがソフトウェアをアクティブ化できません。

ほとんどの安全なスキームは、ソフトウェアを実行するマシンの詳細(CPUシリアル番号、MACアドレス、IPアドレスなど)をソフトウェアサプライヤーに提供するユーザー、またはサプライヤーのWebサイトでソフトウェアを登録するためにオンラインアクセスを必要とする、または代わりにアクティベーショントークンを受け取ります。最初のオプションは多くの手動管理が必要であり、非常に価値の高いソフトウェアに対してのみ価値があります。2番目のオプションは偽装される可能性があり、ネットワークアクセスが制限されている場合やファイアウォールの背後でスタックしている場合は絶対に腹立たしいです。

全体として、顧客との信頼関係を確立する方がはるかに簡単です。


0

https://www.nuget.org/packages/SystemSoulLicense/)からセキュアライセンスAPIを使用して実装することは、それを使用するソフトウェアプロジェクトで非常に簡単です(https:/からセキュアライセンスを作成するためのデスクトップアプリケーションをダウンロードする必要があります)/www.systemsoulsoftwares.com/ 1.システムハードウェア(CPU、マザーボード、ハードドライブ)に基づいてクライアントソフトウェアの一意のUIDを作成します(UIDはその一意のシステムの秘密鍵として機能します)2.暗号化されたライセンス文字列をクライアントシステムに非常に簡単に送信でき、ライセンス文字列を検証しますこの方法は、ソフトウェア開発者または企業がソフトウェア/開発者/ディストリビューターサービス/機能/クライアントに関する詳細情報を保存できるようにします。4.クライアントソフトウェア機能のロックおよびロック解除を制御できるため、開発者の時間を節約できます。機能が変更された同じソフトウェアのバージョンを増やす5.試用版も日数に関係なく処理されます6.登録時にオンラインでDateTimeを確認することにより、ライセンスのタイムラインを保護します。7.開発者に対するすべてのハードウェア情報のロックを解除します8。これには、開発者がより複雑な安全なコードを作成するためのライセンス供与のあらゆるプロセスでアクセスできる、すべての事前構築およびカスタム機能があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.