使用字母数字子集生成 1M 个唯一随机密钥

2023-12-27

我想生成 1M 个随机(出现的)唯一字母数字密钥并将它们存储在数据库中。每个密钥的长度为 8 个字符,并且仅使用子集“abcdefghijk n pqrstuvxyz 和 0-9”。

字母 l、m、o 和 w 被丢弃。由于印刷空间有限,“m 和 w”被省略,因为每个按键将在非常小的空间内印刷在产品上。删除 m 和 w 可以将字母大小增加 2pt,从而提高可读性。 l 和 o 被删除,因为它们在当前打印尺寸下很容易与 1、i 和 0 混淆。我们做了一些测试,字符 1、i 和 0 总是被正确读取,l 和 o 有很多错误。大写字母被排除的原因与“m 和 w”相同。

那么为什么不按顺序呢?有几个原因:密钥可以在之后注册,我们不希望任何人猜测序列中的下一个密钥并注册其他人的密钥。外观:我们不需要客户和竞争对手知道我们只发货了几千把钥匙。

有没有一种实用的方法来生成密钥,确保每个密钥的唯一性并将它们存储在数据库中?谢谢!


编辑:@CodeInChaos指出了一个问题:System.Random不是很安全,并且可以毫无困难地复制该序列。我已经更换了Random这里有一个安全的生成器:

var possibilities = "abcdefghijknpqrstuvxyz0123456789".ToCharArray();
int goal = 1000000;
int codeLength = 8;
var codes = new HashSet<string>();
var random = new RNGCryptoServiceProvider();
while (codes.Count < goal)
{
    var newCode = new char[codeLength];
    for (int i = 0; i < codeLength; i++)
        newCode[i] = possibilities[random.Next(possibilities.Length)];
    codes.Add(new string(newCode));
}
// now write codes to database

static class Extensions
{
    public static byte Next(this RNGCryptoServiceProvider provider, byte maximum)
    {
        var b = new byte[1];
        while (true)
        {
            provider.GetBytes(b);
            if (b[0] < maximum)
                return b[0];
        }
    }
}

(下一个方法不是很快,但可能足以满足您的目的)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用字母数字子集生成 1M 个唯一随机密钥 的相关文章

随机推荐