Random 生成唯一的N值密钥

Random 生成唯一的N值密钥,random,key,Random,Key,我想生成唯一的随机N值密钥。 该键可以包含数字和拉丁字符,即A-Za-z0-9 我考虑的唯一解决方案是这样的(伪代码): key=”“; smb=“ABC…ABC…0123456789”//允许的符号 对于(i=0;i

我想生成唯一的随机N值密钥。 该键可以包含数字和拉丁字符,即A-Za-z0-9

我考虑的唯一解决方案是这样的(伪代码):

key=”“;
smb=“ABC…ABC…0123456789”//允许的符号
对于(i=0;i

有没有更好的解决办法?你有什么建议吗?

我想看看s。从Wikipedia条目中可以看出,“GUID的主要目的是拥有一个完全唯一的数字”,这听起来与您要查找的完全一样。有几种实现可以生成guid,因此您可能不必重新发明轮子。

您可以对一些随机数据进行base64编码,并从结果中删除+、/、和=字符?我不知道这是否会产生一个可预测的分布。此外,似乎你现在所做的工作比你现在所做的更多,这是一个很好的解决方案。

请记住,整个密码学领域都依赖于生成随机数。因此,国家安全局、中央情报局和世界上一些最优秀的数学家正在研究这个问题,所以我向你们保证,会有更好的想法

我?我会照fbrereto的建议去做,然后得到一个guid。或者看看加密密钥发生器,或者你知道的,一些熔岩灯和一个摄像头


哦,至于你的密码;根据语言的不同,您可能需要为RNG设定种子,否则它每次都会生成相同的密钥。

假设您使用的语言/库没有完全可怜的随机数生成器,那么您拥有的看起来相当不错。N个符号均匀地分布在一个合理的字母表上,对我来说很有效,再多的使用更华丽的代码也不可能使它变得更随机(只是更慢)


(作为记录,pathetic将包括在从给定范围中选择值时丢弃基础随机数的高阶位。虽然理想情况下,所有RNG将使每个位都具有相同的随机性,但实际上并非如此;高阶位往往更随机。这意味着使用模运算符是完全错误的当夹持到限制范围时。)

无论您做什么,如果您最终生成一个使用所有数字和字母的键,并且如果有人会看到该键(如果您使用的是数字和字母,则可能会看到该键),省略字符
l
I
1
O
0
0人们会把它们弄糊涂

您的帖子中没有任何内容可以解决唯一性问题。您必须有某种方法不生成同一个密钥两次。通常,当我需要唯一密钥时,我会从一些唯一信息开始。我通常使用一个单向散列,如MD5,然后有一些方法将其转换为具有va的密钥阅读的可读性程度:

  • 转换为十六进制
  • Base64编码它
  • 使用键的位索引到单词列表中

示例:通过将此答案中位于水平线上方的部分散列计算得到的唯一字符串为

绑架案是brogue的融化bragger的


真正好的随机性令人惊讶地难以做到。这里是windows出错的地方,SSL出错的地方,Linux出错的地方。我忘记了细节,但我认为美国警告戈尔巴乔夫1991年苏联政变的企图,因为俄罗斯密码系统中的RNG不是完全随机的。我打赌提问者不需要那个级别安全性,而不是简单的密码生成器。但重要的是,不要让任何攻击者随意尝试破解密码,也不要首先应用特别奇特的规则来生成密码;在安全性上花费的精力应该与被攻击的威胁成比例受保护。始终。谢谢!GUID看起来非常优雅。谢谢。当然,我确实分配了种子,但是以基本的方式分配的(也许是糟糕的方式)。类似于seed=currentSeconds+currentmissions。但我怀疑这有多糟糕/好。很多人使用time()作为种子,因为你从来不会两次获得相同的值。如果“currentSeconds”是“从纪元算起的秒数”就可以了。不管你是否使用guid,这都无关紧要。guid生成器也使用当前时间作为种子的一部分。
key = "";
smb = "ABC…abc…0123456789"; // allowed symbols
for (i = 0; i < N; i++) {
    key += smb[rnd(0, smb.length() - 1)]; // select symbol at random position
}