web-dev-qa-db-ja.com

ライセンスキーアルゴリズムを探しています

Stack Overflowで要求されるライセンスキーに関連する質問はたくさんあります。しかし、彼らはこの質問に答えません。

技術に依存せず、数学の卒業証書を必要としない単純なライセンスキーアルゴリズムを誰でも提供できますか?

ライセンスキーアルゴリズムは、公開キー暗号化に似ています。プラットフォーム.NET/Javaで実装でき、文字などの単純なデータを使用するシンプルなものが必要です。

擬似コードとして記述された回答は完璧です。

そのため、人が文字列を提示した場合、認証コードである補完的な文字列を生成できます。以下は、使用される一般的なシナリオです。

  1. お客様は、最初の起動/インストール時に一意のキーを生成するソフトウェアをダウンロードします。
  2. ソフトウェアは試用期間中に実行されます。
  3. 試用期間の終了時には、認証キーが必要です。
  4. 顧客は指定されたWebサイトにアクセスし、コードを入力し、認証コードを取得してソフトウェアを有効にします。

私は数学者ではないので、あなたが5歳の子供と話しているかのように答えを説明することを恐れないでください。

33
angryITguy

信頼できるライセンスアルゴリズムはありません。本当に。 1つでもありません。購入できる最も人気のある最も高価なプロプライエタリソフトウェアについては、「キージェネレーター」や、ライセンスを必要としないハッキングされたバージョンもあります。

「壊れない」ようにすることを心配する代わりに、単純なことをしてください。人気のあるメカニズムは、購入時にユーザーの名前を尋ね、ユーザーの名前の暗号化ハッシュ(MD5合計など)またはそのバリエーションから派生したライセンスキーを彼に与えることです。次に、ソフトウェアで再度名前と、登録キー(MD5から派生したもの)を要求します。それらが一致することを確認して、ソフトウェアをアクティブにします。

これはハッキングできますか?絶対に。誰かがライセンスキーをどのように生成しているのかを理解したら、彼らは自分でライセンスキーを生成できます。ただし、これまでに生成した「公式」ライセンスキーのデータベースを保持していれば、少なくとも後で(おそらく「プレミアム」コンテンツなどをダウンロードしようとするときに)詐欺師を特定できます。

しかし、ハッカーがコードをクラックするのを止めることについてあまり心配しないでください。それは起こりそうですが、それらは市場のごく一部であるため、全体的な売上に大きな影響を与えることはありません。

42
tylerl

私はこのようなシステムを使用しています:

•Windowsライセンスキー+試用期間終了日から文字列を作成する

•文字列からハッシュ(Sha/md5)を生成する

•試用の終了日をintに変換します(例:日数)

•キーは試用終了日+ハッシュの一部になります

•キーを大文字のみに変換して、入力しやすくする

ABCD-DEFG-HIJK ...

検証は次のように機能します

•キーを再びバイトに変換する

•試用終了日を抽出する

•Windowsライセンスキー+試用終了日から文字列を作成する

•ハッシュ

•ハッシュと残りのキーを比較する

これは私の聴衆にとってそれを十分に困難にします。

7
adrianm

正直なところ、あなたがやろうとしていることは無意味です。検証/暗号化/キーシステムを書くのにどれだけ時間がかかりますか、誰かがそれを破るのにおよそ半分を見積もってください。最終的な実行可能ファイルを暗号化しても。ただし、遅延対策または盗まれたコピーのプレミアムサポートを取得する機会を減らす方法として、それは役立ちます。バイヤーの簡単な追跡にも。または楽しみのために。 :p

とにかく、それを処理する方法はいくつかあります。多くのソフトウェアは、名前(および場合によっては会社)の文字列とハッシュ関数を使用してキーを生成します。これには、定数であるという利点があります(名前が同じであり、ハッシュが同じであるため、キーも同じです)。また、特にMD5などの有名なハッシュを使用する場合は、非常にシンプルなシステムです。

hash = md5(name);

洗練されたアプリの中には、内部関数を使用して何らかの検証コードを生成するものがあり、それと指定された名前を組み合わせると、ハッシュを作成(および送信)できます。

validCode = getCode(name);
hash = myHash(name ^ validCode);

いくつかはシステムベースのコードを使用し(Windowsが良い例です)、ハードウェアのビットをサンプリングし、そこから識別子を構築します。プロセッサの名前や速度などを把握できれば、そのようなものを実行できます。唯一の問題は、システムの変更によりコードが無効になる可能性があるため、ユーザーに警告する(およびプロセスの一部を公開する)か、誤って見つけるようにする(良くない)ことです。

sysID = processor_name() | ram_Speed();
hash = md5(sysID & name);

ハッシュ関数、データ取得、文字列入力、ブール演算などの任意の組み合わせを使用できます。考慮すべきことの1つは、プロセスを逆にする必要がないことです。同じ結果で複製できる限り(任意の適切なハッシュ関数が可能)、ハッシュされた結果を相互にチェックし、有効であることを確認できます。入れるほど複雑になりますが、クラックするのは難しくなります。

それがあなたの質問に役立つことを願っています。

3
ssube

答えは、いいえ、理解するのに数学的学位を必要としない安全なライセンスキーアルゴリズムはありません。

最適なライセンスキーは、非対称暗号化アルゴリズムでデジタル署名されたものです。プライベート暗号化キーでキーデータに署名し、キーに署名を埋め込みます。公開キーを使用してキーの検証(署名検証などを意味します)を実行します。この方法では、プライベートキーであるプライベートキーにアクセスできない限り、誰もライセンスキーを作成できません。問題は、プロダクトキーに埋め込むのに十分に短い署名サイズを持つアルゴリズムが非常に少ない(そして難しい)ことです。 RSAはそれらの1つではありません(RSA512の署名サイズは1024ビット-多すぎます)。

楕円曲線暗号化を使用して短いデジタル署名付きライセンスキーを生成するSoftActivate Licensing SDKを確認できます(C++/C#ソースコードが利用可能です)。

3
Kevin Levrone

セキュリティの問題では、よく知られたテスト済みのアルゴリズムを再利用せず、独自の(数学的な知識を欠いて)作成しようとするのは自殺です

開示:私はそのようなアルゴリズムを作成する数学的な程度を完全に欠いており、率直に言って、私はそれを持っている人を個人的に知りません

2
Pablo Fernandez

あなたが作るアルゴリズムは壊れるので、私はこのような簡単なことをします:

const string secretMumboJumbo = "sdfkldafskjlfajmkldsfjaewumaskldfladkkldsfklj"

//For you to generate keys
string GenerateLicenceKey(int idNr)
{
    return Sha1Hmac(key=secretMumboJumbo, messageToEncode=idNr)
}

//For clients to check if key is valid, 
bool IsKeyValid(string key)
{
   for(int i=0;i<maxNrOfLicenceKeys;i++)
      if(key == GenerateLicenceKey(i))
         return true;
   return false;
}

可能性のあるすべてのキーを試行する必要があるため、チェックが遅くなる可能性がありますが、それはブルートフォースを回避するための良いことです。

ほとんどのフレームワークには、SHA1用のHMAC関数またはその他のハッシュ関数が必要です。さらに悪いことに、これをmd5(key + id)に置き換えることができます

このアルゴリズムをあまり真剣に受け取らないでください。これは単なる例に過ぎず、バイナリがどこかに隠されていても、生成キーをクライアントに含める必要があるため、おそらく非常に簡単に破損する可能性があります。

1
bleo

私の正直な意見では、ライセンスキーはかなり役に立たない。
顧客がそのキーを他の人に配布するのを止めるにはどうすればよいですか?アクティベーションの回数を記録するライセンスキーサーバーをセットアップすることはできますが、費用がかかります。

私の専門的な意見では、ユーザーに一意にブランド化されたソフトウェアを作成します(もちろん、プログラム内で暗号化されます)。たとえば、ヘルプ->ソフトウェアについての情報に移動すると、その人の名前、電話、そして場合によってはその住所が表示されます。このようにして、彼らが何らかの海賊版サイトにアップロードした場合、他の人がこの人の個人情報を知るだけでなく...

0
Natalie Adams