生成漂亮的BETA键

时间:2012-04-29 00:39:37

标签: algorithm math encryption random beta

我构建了一个即将推出beta测试的Web应用程序。我真的很想发布看起来不错的beta邀请和密钥。

即。 A3E6-7C24-9876-235B

这是大约16个字符,十六进制数字。 它看起来像您可能看到的典型beta密钥。 我的问题是生成这样的东西的标准方法是什么,并确保它是独一无二的,并且人们猜测测试密钥并生成他们自己的密钥并不容易。

我有一些可能适用于测试版密钥的想法:

  • MD5对此来说足够安全,但它长而丑陋,可能导致0和O,或1和l之间的混淆。
  • 我可以从一个16位长的大十六进制数开始。为了防止人们猜测下一个beta密钥可能会每次增加一个随机数。即使我正在跳过大量数字,1111-1111-1111-1111和eeee-eeee-eeee-eeee之间的数字范围仍有足够的空间。

我想我只是想知道是否有一种标准的方式来做到这一点,我没有找到谷歌。还有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

规范的“唯一识别号码”是uuid。有各种形式 - 例如,您可以从随机数(版本4)或某个值的哈希(用户的电子邮件+盐?)(版本3和5)生成一个。

java,python和更多的库存在。

PS我必须补充一点,当我阅读你的问题标题时,我认为你正在寻找一些很酷且不同的东西。您可以考虑使用“有趣的”单词列表并将单词与连字符组合以编码数字(基于电子邮件+盐的哈希)。这将是更有吸引力的imho:“你的beta代码是秘密 - 袋熊 - cookie-ninja”(我确定我读过一篇描述一个例子的文章,但我现在找不到它。)

答案 1 :(得分:3)

一种方式(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随机类来生成随机字节(可能修改字母长度)。

答案 2 :(得分:1)

计算能力很便宜,把你对MD5的想法运用起来并运行你自己设计的“审美”。下面的代码几乎瞬间生成2000个唯一键,其中没有0,1,L,O个字符。修改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', ...