Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encoding 如何生成唯一、小、随机且用户友好的密钥?_Encoding_Cryptography_Key - Fatal编程技术网

Encoding 如何生成唯一、小、随机且用户友好的密钥?

Encoding 如何生成唯一、小、随机且用户友好的密钥?,encoding,cryptography,key,Encoding,Cryptography,Key,几个月前,我的任务是为我们的web应用程序实现一个独特的随机代码。代码必须是用户友好的,并且尽可能小,但本质上仍然是随机的(因此用户无法轻松预测序列中的下一个代码) 它最终生成的值如下所示: Af3nT5Xf2 不幸的是,我从未对实施感到满意。Guid是不可能的,它们太大,用户很难输入。我希望在4或5个字符/数字的行上有更多的东西,但是如果我们编码到少于9个字符,我们的特定实现将生成明显的模式序列 下面是我们最后做的: 我们从数据库中提取了一个唯一的顺序32位id。然后我们将其插入64位随机整

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

它最终生成的值如下所示:

Af3nT5Xf2
不幸的是,我从未对实施感到满意。Guid是不可能的,它们太大,用户很难输入。我希望在4或5个字符/数字的行上有更多的东西,但是如果我们编码到少于9个字符,我们的特定实现将生成明显的模式序列

下面是我们最后做的:

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

最终的结果是代码比guid小得多,看起来是随机的,尽管它绝对不是

我从未对这个特定的实现感到满意。你们会怎么做?

在C#中,我使用了“”方法。。。但我正在为调试文件名生成salt。此方法返回的内容与第一个示例类似,但扩展名也是随机的“.xyz”


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

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


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

下面是我的方法

我会得到一个常用英语单词的列表,包括使用频率和一些语法信息(比如它是名词还是动词?)。我想你可以在互联管道周围找一些副本。Firefox是开源的,它有一个拼写检查器。。。所以它一定是可以得到的

然后我会在上面运行一个过滤器,以便删除模糊的单词,并排除过长的单词

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

我还可以在动词/名词之间随机选择单词,如

eatCake778
扒手524
山脊 等等

这种情况不必是驼峰式的,你也可以随机化。您还可以随机化数字和动词/名词的位置

由于这是一个很大的随机化,杰夫的是一个必须阅读。还要确保提前研究字典攻击


在我实现它之后,我会运行一个测试来确保我的算法永远不会冲突。如果冲突率很高,那么我会使用参数(使用的名词数量、使用的动词数量、随机数长度、单词总数、不同类型的大小写等)

如果用户友好,你的意思是用户可以键入答案,那么我想你会想从不同的方向看。我已经看到并完成了初始随机密码的实现,它将随机单词和数字作为一个更简单、更不容易出错的字符串


如果您正在寻找一种在URL字符串中对随机代码进行编码的方法,这是我已经处理了一段时间的问题,那么我所做的就是使用64位编码的GUID。

您可以按照chakrit的建议,使用唯一的顺序键将单词列表加载到数据表或xml文件中。获取随机单词时,请使用随机数生成器确定要通过关键字获取的单词。如果将其中两个串联起来,我认为不需要在字符串中包含数字,除非“真正的随机性”是目标的一部分。

在撰写本文时,这个问题的标题是:

如何生成唯一、小、随机且用户友好的密钥

对于这一点,我应该注意到,通常不可能创建一个也唯一的随机值,至少如果每个随机值是独立于任何其他值生成的。此外,如果要生成唯一标识符(来自my),您应该问自己很多问题:

  • 应用程序能否在所需范围内轻松检查标识符的唯一性(例如,检查具有该标识符的文件或数据库记录是否已存在)
  • 应用程序能否承受为不同资源生成相同标识符的风险
  • 标识符必须是难以猜测的,仅仅是“随机的”,还是两者都不是
  • 最终用户是否必须键入或以其他方式转发标识符
  • 标识符标识的资源是否可供知道该标识符的任何人使用(即使未以某种方式登录或授权)
  • 标识符必须令人难忘吗
  • 在您的情况下,您有几个相互冲突的目标:您想要的标识符是-

    • 独特的
    • 终端用户易于键入(包括小型),以及
    • 难以猜测(包括随机)
    问题中未提及的要点包括:

    • 如何使用钥匙
    • 当其他用户知道密钥时,是否允许他们访问该密钥标识的资源?如果没有,则需要额外的访问控制或更长的密钥长度
    • 您的应用程序能否承受重复密钥的风险?如果是这样,则可以完全随机生成密钥(例如通过
      byte[] randomBytes = new byte[4];
      RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
      rng.GetBytes(randomBytes);