3

まもなくベータ テストを開始する Web アプリケーションを作成しました。見栄えの良いベータ版の招待状とキーを配布したいと思っています。

すなわち、A3E6-7C24-9876-235B

これは、約 16 文字の 16 進数です。典型的なベータ キーのように見えます。私の質問は、このようなものを生成し、それが一意であること、および誰かがベータ キーを推測して独自のものを生成することが容易ではないことを確認するための標準的な方法は何かということです。

ベータキーでおそらくうまくいくいくつかのアイデアがあります:

  • MD5 はこれに対して十分に安全ですが、長くて見栄えが悪く、0 と O、または 1 と l の間で混乱を招く可能性があります。
  • 長さが 16 桁の大きな 16 進数から始めることもできます。次のベータキーが何であるかを人々が推測できないようにするために、毎回乱数で値を増やします。1111-1111-1111-1111 と eeee-eeee-eeee-eeee の間の数字の範囲には、大量の数字をスキップしたとしても、十分な余裕があります。

これを行うための標準的な方法があり、Googleで見つけられないかどうか疑問に思っているだけだと思います。より良い方法はありますか?

4

3 に答える 3

3

正規の「一意の識別番号」はuuidです。さまざまな形式があります。たとえば、乱数(バージョン4)または何らかの値のハッシュ(ユーザーの電子メール+ソルト?)(バージョン3および5)から生成できます。

java、python、その他多数のライブラリが存在します。

PSあなたの質問のタイトルを読んだとき、あなたはクールで違うものを探していると思ったことを付け加えなければなりません。「興味深い」単語リストを使用し、単語とハイフンを組み合わせて数値をエンコードすることを検討してください(電子メールのハッシュ+ソルトに基づく)。それははるかに魅力的な私見です:「あなたのベータコードはsecret-wombat-cookie-ninjaです」(例を説明している記事を読んだと確信していますが、今は見つかりません)。

于 2012-04-29T00:54:41.177 に答える
3

1 つの方法 (C# ですが、コードは他の言語に移植できるほど単純です):

private static readonly Random random = new Random(Guid.NewGuid().GetHashCode());

static void Main(string[] args)
{
    string x = GenerateBetaString();
}

public static string GenerateBetaString()
{
    const string alphabet = "ABCDEF0123456789";

    string x = GenerateRandomString(16, alphabet);

    return x.Substring(0, 4) + "-" + x.Substring(4, 4) + "-"
         + x.Substring(8, 4) + "-" + x.Substring(12, 4);
}

public static string GenerateRandomString(int length, string alphabet)
{
    int maxlen = alphabet.Length;
    StringBuilder randomChars = new StringBuilder(length);

    for (int i = 0; i < length; i++)
    {
        randomChars.Append(alphabet[random.Next(0, maxlen)]);
    }

    return randomChars.ToString();
}

出力:

97A8-55E5-C6B8-959E
8C60-6597-B71D-5CAF
8E1B-B625-68ED-107B
A6B5-1D2E-8D77-EB99
5595-E8DC-3A47-0605

このようにすると、アルファベットの文字を正確に制御できます。暗号強度のランダム性が必要な場合 (可能性は低い)、cryto ランダム クラスを使用してランダムなバイトを生成します (アルファベットの長さを変更する可能性があります)。

于 2012-04-29T01:02:07.090 に答える
1

コンピューティング パワーは安価です。MD5 のアイデアを取り入れて、独自に考案した「美学」をセット上で実行します。0,1,L,O以下のコードは、文字を含まない 2000 個の一意のキーをほぼ瞬時に生成します。aesthetic追加の基準に合わせて変更します。

import random, hashlib

def potential_key():
    x = random.random()
    m = hashlib.md5()
    m.update(str(x))
    s = m.hexdigest().upper()[:16]
    return "%s-%s-%s-%s" % (s[:4],s[4:8],s[8:12],s[12:])

def aesthetic(s):
    bad_chars = ["0","1","L","O"]
    for b in bad_chars: 
        if b in s: return False
    return True

key_set = set()

while len(key_set) < 2000:
    k = potential_key()
    if aesthetic(k): 
        key_set.add(k)

print key_set

キーの例:

'4297-CAC6-9DA8-625A', '43DD-2ED4-E4F8-3E8D', '4A8D-D5EF-C7A3-E4D5', 
'A68D-9986-4489-B66C', '9B23-6259-9832-9639', '2C36-FE65-EDDB-2CF7', 
'BFB6-7769-4993-CD86', 'B4F4-E278-D672-3D2C', 'EEC4-3357-2EAB-96F5', 
'6B69-C6DA-99C3-7B67', '9ED7-FED5-3CC6-D4C6', 'D3AA-AF48-6379-92EF', ...
于 2012-05-01T21:17:42.813 に答える