シリアル番号ジェネレーターとバリデーターがどのように機能するのか疑問に思います。私の目的は、数字と文字だけで構成される5つの部分からなるシリアル番号を生成することです。
私は趣味でコーディングを楽しんでおり、自分をプロのプログラマとは呼んでいません。しかし、これらの興味深い機能が技術的にどのように機能して私の心を広げるかに非常に興味があります。
ヒント、経験、または記述されたアルゴリズムは高く評価されます。
Brandon Staggs部分的なシリアル番号検証システムの実装 に関する良い記事を書きました。例はDelphiで記述されていますが、他の言語に変換できます。
まあ、伝統的にシリアル番号はシリアル...番号です。したがって、生産ラインの最初の例ではsn 0001があり、次の例は0002で、次の例は0003です。ほとんどの人はそのアルゴリズムを理解できると思います。
公開鍵メッセージの署名と同様のメカニズムを使用するプロダクトキーについて実際に質問していると思います。プロダクトキーは暗号化された値であり、プログラムには公開キーがあり、キーが有効であることを確認できますが、ソフトウェアベンダーは、プロダクトキーに「署名」するための秘密キーを持っています。 デジタル署名 に関するウィキペディアの記事には一般的なメカニズムがあります。唯一の条件は、ユーザーがキーを入力するためには、PGPキーよりもかなり短くなければならないということです。
非常に短いシリアル番号に制限されている場合、通常の署名メカニズムの結果を保存するのに十分な大きさになることはほとんどありません。その場合、チェックサムのバリアントを使用するのが一般的です。これには、リバースエンジニアリングが容易であるという欠点があります。これは、暗号化の特性ではなく、アルゴリズムが「秘密」であるためにセキュリティが確保されるためです。各製品には独自のアルゴリズムがあり、通常は非常に迅速に解読されます。
5文字の5つのブロックがある場合、36 ^ 25の組み合わせがあり、これは2 ^ 128より大きいため、128ビットを生成する標準のデジタル署名アルゴリズムの1つを使用して、その値を基数36に変換できます。
公開鍵/秘密鍵のペア を取得します。 シーケンス番号 (10000、20000、30000、40000、....)を生成します。これは、特定の特性(例:10000で割り切れる)を持っています。秘密鍵を使用してその番号を暗号化します。人間が読み取り可能なシステム( base 32 または 64 )を使用してその値をエンコードし、値をグループに分けて、人々が解析しやすくします。アプリの販売ごとに、エンコードされたシリアル番号を配布します。
アプリのどこかに、公開鍵が隠されています。ユーザーがエンコードされたシリアル番号を入力するとき、最初にそれをバイナリにデコードします。公開鍵を使用して復号化します。 10000で割り切れることを確認してください。
難しいのは実装です。アプリで公開鍵を非表示にして、簡単に置き換えられないようにします。簡単に識別できるが、値が不足しないシーケンスを選択する。 難読化 アプリ。チェック全体を簡単にスキップできないようにします。等...
A GUID( "Globally Unique Identifier")は、これを解決する簡単な方法です。
http://en.wikipedia.org/wiki/Globally_Unique_Identifier
GUIDは16バイトを含み、最も一般的には次のような一連の16進数としてテキストで記述されます。
3F2504E0-4F89-11D3-9A0C-0305E82C3301
そして、ほとんどのプログラミング言語は、利用可能なライブラリの1つでGUIDを生成できるはずです。
乱数ジェネレータを使用して、出力をデータベースに保存できます。アクティベーション要求の場合、シリアルがデータベースにあるかどうかを確認し、シリアルを「使用済み」としてマークします。
もちろん、これにはインターネット接続が必要ですが、「一度購入して、何度も何度も使用する」方法には適しています。サポートコールの場合は、そのシリアルを再度アクティブにして再インストールできます。
後の編集:HTTPSのような暗号化され認証された接続をインターネット検証に使用する必要もあります。
私のGoogle-Fooを使用して、この記事を思いつきました:
http://www.mactech.com/articles/mactech/Vol.13/13.02/SerialNumberGenerator/index.html