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小得多的代码并且看起来是随机的,即使它绝对不是.
我对此特定实现从未满意.你们会做什么?
我就是这样做的.
我将获得一个常用英语单词列表,其中包含使用频率和一些语法信息(如名词或动词?).我想你可以看看intertubes周围的一些副本.Firefox是开源的,它有一个拼写检查程序......所以它必须以某种方式获得.
然后我会在其上运行一个过滤器,这样就可以删除模糊的单词并排除那些太长的单词.
然后我的生成算法将从列表中选择2个单词并连接它们并添加一个随机的3位数字.
我也可以在动词/名词之间随机化单词选择模式
eatCake778
pickBasket524
rideFlyer113等.
案件不一定是驼峰套管,你也可以随机化.您还可以随机化数字和动词/名词的位置.
而且由于这是很多随机化,杰夫的Naïveté的危险是必读的.还要确保提前学习字典攻击.
在我实现它之后,我会进行测试以确保我的算法永远不会发生碰撞.如果碰撞率很高,那么我会玩参数(使用的名词数量,使用的动词数量,随机数的长度,单词总数,不同类型的外壳等)
在.NET中,您可以使用 RNGCryptoServiceProvider 方法 GetBytes() ,它将“用加密的强随机值序列填充字节数组”(来自 ms 文档)。
byte[] randomBytes = new byte[4];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);
Run Code Online (Sandbox Code Playgroud)
您可以增加字节数组的长度并提取您想要允许的字符值。
在 C# 中,我使用了“ System.IO.Path.GetRandomFileName() : String ”方法...但我正在为调试文件名生成盐。此方法返回的内容与第一个示例类似,但也带有随机的“.xyz”文件扩展名。
如果您使用 .NET 并且只是想要一个更简单(但不是“更好”的外观)的解决方案,我会说就是这样......如果您愿意,您可以删除随机文件扩展名。