質問
C#プログラミングのPHPプログラマと初心者としての私の時代を通して、Microsoft OfficeやMicrosoftオペレーティングシステムなどのユニークなシリアルを生成する最良の方法を常に疑問に思っています。
ユニークなシリアルを生成したり、複製を防ぐなどの重要な要因であるように、これを処理する方法に関する良いガイドがありますか。それらを作成 /検証する方法についての小さな例。
これが私が話しているRFCです: http://tools.ietf.org/html/rfc1982.
解決
アプリケーションがサーバーに戻る接続がある場合は、些細なことです。ランダムトークンを生成し、データベースに保存し、実行する前にアプリケーションをサーバーに確認する必要があります。ただし、一部の顧客は、この要件が受け入れられないと感じる場合があります。 (私は個人的には、インターネットのアクティベーション要件を備えたソフトウェアを購入することはありません。レンタルするのではなく、ソフトウェアを購入したいです。)
サーバーへの接続を持たなくても、真正性のチェック可能性を持つキーの場合:
サーバーで、ランダムな一意のトークンを生成します。
公開キー暗号化スキームを使用します(例: RSA)サーバーに秘密にされている秘密鍵でトークンに署名する。
いくつかのバイナリとテキストのスキームを使用して、一意のトークンと署名を一緒にエンコードします(例:base64、または単に使用する
2-9A-KMNP-Z
より安全ならそりのためのシンボル)。エンコードされた組み合わせは、キーまたはシリアルです。アプリケーションの各コピーのサーバーの秘密キーに一致する公開キーを埋め込み、インストール時にキーのアプリケーションプロンプトをプロンプトにします。ユニークなトークンと署名を分割し、公開キーを使用して、署名がそのトークンに有効であることを確認できます。
このアプローチでは、ソフトウェアでいくつかの暗号ライブラリをバンドルする必要があります。ほとんどのアルゴリズムは、セキュリティのために非常に長い署名を使用します。これにより、シリアル番号が入力するのがかなり面倒になります。
これらの理由により、多くのソフトウェアパッケージは、チェックアルゴリズムがクライアントに完全に組み込まれている、あまり安全でないキー検証スキームを使用しています。これはハッシュかもしれません。シリアルの最後の4ヘクス桁は、シリアルの残りの部分のSHA1ハッシュの最低2バイトと「秘密」キーと組み合わされている必要があります。ただし、キーをアプリケーションにバンドルする必要があるため、ハッカーがアプリコードを調べて「秘密」キーを抽出して、独自のキージェネレーターを作成できるようにすることができます。
そのため、一部のプログラムでは「keygens」が利用可能になります。アプリは、クラッカーがキーメイキングプロセスを再現できるように、アプリケーションに十分な情報を残したほど安全でないチェックアルゴを使用しました。パブリックキーの暗号またはインターネットのアクティベーションに基づいたより安全なセットアップを備えたプログラムの場合、通常、チェックコードが変更/削除されている「クラック」バージョンのアプリケーションが表示されます。
...あなたが何をするにしても、あなたはまだ誠実さを強制することができないことを示しています。だからそれについてあまり心配しないでください。
他のヒント
これが私たちの解決策です。有効なIPv4、userID(または意味のある整数)、またはテキスト文字列に基づいて、構成可能なサイズ/長さとオプションの接尾辞を備えたキーを生成します。また、標準の結果では、曖昧な文字(i、1、l、0、o、o)を回避します。
ライセンスにユーザーIDを追加し、後でその部分をbase10整数に戻し、ライセンスを使用しているユーザーアカウントに対して有効かどうかを確認できます。
$license = generate_license();
// YF6G2-HJQEZ-8JZKY-8C8ZN
$license = generate_license(123456);
// ZJK82N-8GA5AR-ZSPQVX-2N9C
$license = generate_license($_SERVER['REMOTE_ADDR']);
// M9H7FP-996BNB-77Y9KW-ARUP4
$license = generate_license('my text suffix');
// Q98K2F-THAZWG-HJ8R56-MY-TEXT-SUFFIX
作成時にデータベースの一意性を確認しますが、ランダム性と併せてIP/UserIDを使用すると、重複の可能性は実質的にゼロです。
/**
* Generate a License Key.
* Optional Suffix can be an integer or valid IPv4, either of which is converted to Base36 equivalent
* If Suffix is neither Numeric or IPv4, the string itself is appended
*
* @param string $suffix Append this to generated Key.
* @return string
*/
function generate_license($suffix = null) {
// Default tokens contain no "ambiguous" characters: 1,i,0,o
if(isset($suffix)){
// Fewer segments if appending suffix
$num_segments = 3;
$segment_chars = 6;
}else{
$num_segments = 4;
$segment_chars = 5;
}
$tokens = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
$license_string = '';
// Build Default License String
for ($i = 0; $i < $num_segments; $i++) {
$segment = '';
for ($j = 0; $j < $segment_chars; $j++) {
$segment .= $tokens[rand(0, strlen($tokens)-1)];
}
$license_string .= $segment;
if ($i < ($num_segments - 1)) {
$license_string .= '-';
}
}
// If provided, convert Suffix
if(isset($suffix)){
if(is_numeric($suffix)) { // Userid provided
$license_string .= '-'.strtoupper(base_convert($suffix,10,36));
}else{
$long = sprintf("%u\n", ip2long($suffix),true);
if($suffix === long2ip($long) ) {
$license_string .= '-'.strtoupper(base_convert($long,10,36));
}else{
$license_string .= '-'.strtoupper(str_ireplace(' ','-',$suffix));
}
}
}
return $license_string;
}
私の解決策
implode( '-', str_split( substr( strtoupper( md5( time() . rand( 1000, 9999 ) ) ), 0, 20 ), 4 ) );
私はあなたが何を望んでいるのか絶対にわかりませんが、そこにあります http://www.php.net/manual/en/function.uniqid.php 一意の識別子を作成します。
それらがどのように作成されているかにもっと興味がある場合は、PHPソースを見て、UNIQIDがどのように実装されているかを確認するようアドバイスします。
ランダムなシリアル番号を中央に作成する場合は、数字と文字の配列からランダムにフェッチするだけで十分です。使用する mt_rand(0, count($poolArray))
毎回新しいインデックスを取得し、12個が12個と言うまで、その文字をシリアルに追加するだけです。
このような大きなプール(26文字 + 10桁)からランダムに生成すると、複製がないことを確認しますが、新しいものを保存する前に既存のプールを常に確認できます。
36個のキャラクターがあり、シリアルを作成するために12個の文字をランダムに選択した場合、36*36*36*...*36 = 36^12 = 4738381338321616896可能な文字列です。
$pool = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$countPool = count($pool) ;
$totalChars = 12 ;
$serial = '' ;
for ($i = 0 ; $i < $totalChars ; $i++) {
$currIndex = mt_rand(0, $countPool) ;
$currChar = $pool[$currIndex] ;
$serial .= $currChar ;
}
コードでそれらを配布するか、プログラムに有効なシリアルをチェックさせることは別の問題です。
もう少し情報が必要です。ゲームを購入するときや、一意のユーザーIDのシリアルが必要ですか?
シリアル番号は、有効期限/日付などの情報を保存する必要がありますか?
@nikic-ランダムジェネレーターを起動するためのベースとしてのすべてのRANDの使用時間。そのため、DODは溶岩ランプを使用しています。彼らは、溶岩ランプに特化した部屋全体を持っており、独自のキーをランダムに作成するためにレーザーを輝かせます。
編集:
まあ、あなたが有効にする必要があるのは、あなたのC#アプリケーションがあなたのサイトとの通信に使用する方法です。
C#がシリアルが正しいものであることを確認できるように、PHPでキーを作成してデータベースに保存する必要があります。
次に、PHPが別の値を返すかどうかを把握する必要があります。これにより、C#アプリケーションがキーが認証されているかどうかを認識しています。
貼り付けられたことで私がやったことは、公開鍵と秘密鍵を作成することでした。公開キーは、製品を検証するためにユーザーに与えられます。製品を検証したり、システムにログインすると、公開キーがデータベースに対してチェックされ、返品値が秘密キーになります。私のC#プログラムとのすべての対話中に、ユーザーが更新をチェックしたり、サーバーから情報を引き出したりする必要がある場合、秘密キーはサーバーにクエリに追加され、エンドユーザーが合法であることを確認します。
私が使用した別の方法も上記ですが、ユーザーがキーを共有していないことを確認するために追加のチェックを追加しました。 C#アプリケーションは、コンピューター内のプロセッサのシリアル番号を取得し、アプリケーションを登録すると、データベースに保存されます。その後、他の誰かが同じ公開キーで製品を登録しようとしたが、プロセッサのシリアル番号が異なる場合、エラーが発生し、サポートに連絡する必要があります。これを行うには、5つの異なるマシンIDまたは必要なすべてのマシンIDを許可できます。
登録キーを作成することは非常に簡単です。実際、オフセット(ユーザー名など)を備えたランダムな文字列を作成するだけです。
ただし、誰かが提供する名前または会社名に基づいて登録キーを作成して、そのアルゴリズムをC#プログラムに追加することもできます。それの欠点は、C#ソースコードを簡単に処理できることです。アルゴリズムは、誰かが実際に製品にお金を払うことなく簡単に登録コードを作成することができます。認証を行うサーバーを追加することにより、誰かが独自のシリアルキーを生成することははるかに困難です。
このような数字をプロジェクトに使用して作成しました。
<?php
$license = rand(1000,9999) . '-' . rand(1000,9999) . '-' . rand(1000,9999) . '-' . rand(1000,9999) . '-' . rand(1000,9999);
print_r($license);
?>
これがあります 詳細が必要な場合は詳細を確認してください. 。私はすでに私の製品の1つにこのタイプのライセンスを使用しています Strom Email Autoresponder 購入したユーザーを検証するため。