如何生成一个独特,小巧,随机且用户友好的密钥?

bmu*_*976 13 encoding cryptography key

几个月前,我的任务是为我们的Web应用程序实现一个独特的随机代码.代码必须是用户友好的并且尽可能小,但仍然基本上是随机的(因此用户无法轻易预测序列中的下一个代码).

它最终生成的值看起来像这样:

Af3nT5Xf2
Run Code Online (Sandbox Code Playgroud)

不幸的是,我对实施从未满意.Guid是不可能的,它们对于用户来说太大而且难以输入.我希望能够提供更多的4或5个字符/数字的内容,但是如果我们编码为的话,我们的特定实现会生成明显的图案序列少于9个字符.

这是我们最终做的事情:

我们从数据库中提取了一个唯一的顺序32位id.然后我们将它插入64位RANDOM整数的中心位.我们创建了一个易于键入和识别的字符的查找表(AZ,az,2-9跳过容易混淆的字符,如L,l,1,O,0等).最后,我们使用该查找表对64位整数进行base-54编码.高位是随机的,低位是随机的,但中心位是顺序的.

最终结果是一个比guid小得多的代码并且看起来是随机的,即使它绝对不是.

我对此特定实现从未满意.你们会做什么?

cha*_*rit 7

我就是这样做的.

我将获得一个常用英语单词列表,其中包含使用频率和一些语法信息(如名词或动词?).我想你可以看看intertubes周围的一些副本.Firefox是开源的,它有一个拼写检查程序......所以它必须以某种方式获得.

然后我会在其上运行一个过滤器,这样就可以删除模糊的单词并排除那些太长的单词.

然后我的生成算法将从列表中选择2个单词并连接它们并添加一个随机的3位数字.

我也可以在动词/名词之间随机化单词选择模式

eatCake778
pickBasket524
rideFlyer113等.

案件不一定是驼峰套管,你也可以随机化.您还可以随机化数字和动词/名词的位置.

而且由于这是很多随机化,杰夫的Naïveté的危险是必读的.还要确保提前学习字典攻击.

在我实现它之后,我会进行测试以确保我的算法永远不会发生碰撞.如果碰撞率很高,那么我会玩参数(使用的名词数量,使用的动词数量,随机数的长度,单词总数,不同类型的外壳等)


Jos*_*ner 5

在.NET中,您可以使用 RNGCryptoServiceProvider 方法 GetBytes() ,它将“用加密的强随机值序列填充字节数组”(来自 ms 文档)。

byte[] randomBytes = new byte[4];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);
Run Code Online (Sandbox Code Playgroud)

您可以增加字节数组的长度并提取您想要允许的字符值。


Ant*_*ean 3

在 C# 中,我使用了“ System.IO.Path.GetRandomFileName() : String ”方法...但我正在为调试文件名生成盐。此方法返回的内容与第一个示例类似,但也带有随机的“.xyz”文件扩展名。

如果您使用 .NET 并且只是想要一个更简单(但不是“更好”的外观)的解决方案,我会说就是这样......如果您愿意,您可以删除随机文件扩展名。