さて、答えなしで2週間。基本的な方法を使用して、比較的安全で拡張性の高いシリアル番号を生成するために思いついた非常に簡単な方法で答えます。
数学者として、私はあらゆる種類の情報をシリアル番号に保存するためのいくつかの高度な技術があることを非常に確信していますが、私は主に手っ取り早い方法に興味があります。
考慮すべき、素朴で非数学的な力ずくのテクニックを次に示します。
byte[]
使用する文字を含む配列を作成します。ヘクスのみを使用できますが、自分を制限する理由はありません。英数字の範囲全体から「0」/「O」および「1」/「I」を引いたものを使用しないのはなぜですか(明らかな理由で)。
次に、次のように関数を記述します(例はC#です)。
byte[] genRandomSerial(int length, byte[] characters, Random r)
{
var sn = new byte[length];
for (int i = 0; i < length; i++)
sn[i] = characters[r.Next(0, characters.Length)];
return sn;
}
これにより、ランダムなシリアル番号が提供されますが、有効かどうかはわかりません。
次:
int sum(byte[] sn, MD5 md5)
{
val = 0;
foreach (byte b in md5.ComputeHash(sn))
val += (int)b;
return val;
}
その後
bool validate(byte[] sn, uint radix, uint expected, MD5 md5)
{
return (sum(sn, md5) % radix == expected);
}
現在、MD5ハッシュ関数の16バイトの出力を合計し、 nを法とする合計がxに等しいかどうかを評価する方法があります。
次に、存在するシリアル番号の数を決定します。シリアル番号が多いほど、誰かが有効な組み合わせをランダムに推測しやすくなります。
ランダムシリアルをブロックに分割します。4の5ブロックを考えてみましょう:ABCD-EFGH-IJKL-MNOP-QRSTの形式で20文字を与えます
シリアル番号から5つのアレイを作成します。
{A、B、C、D}、{E、F、G、H}、{I、J、K、L}、{M、N、O、P}、および{Q、R、S、T} 。
5つのアレイが次のように検証されるかどうかをテストします。
if (validate(block1, radix, expected, md5))
// This block is valid.
基数を2に設定すると、ブロックが有効になる確率は1/2になります。基数を10に設定すると、ブロックが有効になる確率は1/10になります。5つのブロックがあり、それぞれの基数を10に設定した場合、シリアル番号全体が有効になる確率は0.1 ^ 5=0.00001です。(つまり、100000のランダムシリアルごとに1つが有効になります。つまり、英数字の範囲から「0」/「O」、「1」/「I」を引いたものを使用すると、(8 + 24)^ nになります。 * 0.00001 =〜1.2*シリアル長20の場合は10^19の有効なキー。これは多くのことですが、とにかくすべてを見つけることはできないことを忘れないでください。基数が高いほど、シリアルの安全性は高くなりますが、生成に時間がかかります)。
'expected'は0と基数-1の間のどこかにある必要があることに注意してください。
これで、特定のシリアル番号を有効として検証する方法ができましたが、それがどのタイプのシリアルであるかをどのように保存するのでしょうか。実際のところ、私たちはすでにそれを行う方法を持っています。ランダムな(ただし検証済みの)シリアル'sn'全体を取得します。
int licenseType = sum(sn, md5) % 4; // Where 4 is the number of licenses you want to have
if (licenseType == 0)
{
// Evaluation
}
else if (licenseType == 1)
{
// Standard
}
else if (licenseType == 2)
{
// Full
}
else // licenseType == 3
{
// Unrestricted
}
キーを生成するにつれて、各タイプのライセンスの数は徐々に横ばいになります。
有効期限などの追加情報をキーに保存する場合は、同様の方法を使用できます。たとえば、12を法とする奇数文字の合計を取得して有効期限の月を取得し、偶数文字の合計の31を法として有効期限を取得することができます。
適用するこれらの制限と細分化が多いほど、各タイプのキーの生成にかかる時間が長くなります。