Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 生成好看的BETA密钥_Algorithm_Math_Encryption_Random_Beta - Fatal编程技术网

Algorithm 生成好看的BETA密钥

Algorithm 生成好看的BETA密钥,algorithm,math,encryption,random,beta,Algorithm,Math,Encryption,Random,Beta,我构建了一个web应用程序,很快就要进行beta测试了。我真的很想发出测试邀请和钥匙,看起来不错 i、 e.A3E6-7C24-9876-235B 这大约是16个字符的十六进制数字。 它看起来像是您可能看到的典型beta密钥。 我的问题是,生成这样的东西的标准方法是什么,并确保它是唯一的,并且不容易让人猜测一个beta密钥并生成自己的密钥 我有一些可能适用于测试版密钥的想法: MD5对此足够安全,但它又长又难看,可能会导致0和O或1和l之间的混淆 我可以从一个16位数的大十六进制数开始。为了防

我构建了一个web应用程序,很快就要进行beta测试了。我真的很想发出测试邀请和钥匙,看起来不错

i、 e.A3E6-7C24-9876-235B

这大约是16个字符的十六进制数字。 它看起来像是您可能看到的典型beta密钥。 我的问题是,生成这样的东西的标准方法是什么,并确保它是唯一的,并且不容易让人猜测一个beta密钥并生成自己的密钥

我有一些可能适用于测试版密钥的想法:

  • MD5对此足够安全,但它又长又难看,可能会导致0和O或1和l之间的混淆
  • 我可以从一个16位数的大十六进制数开始。为了防止人们猜测下一个beta密钥可能是什么,每次将该值增加一个随机数。1111-1111-1111-1111-1111和eeee-eeee之间的数字范围将有足够的空间,即使我跳过大量的数字
我想我只是想知道,是否有一个标准的方式来做这件事,我没有找到与谷歌。有更好的方法吗?

标准的“唯一识别号”是一个。有多种形式-例如,您可以从随机数(版本4)或某个值的散列(用户的电子邮件+salt?)(版本3和5)生成一种形式

java、python和更多的库已经存在

PS我必须补充一点,当我读到你的问题标题时,我认为你在寻找一些很酷和不同的东西。您可以考虑使用一个“有趣”的单词列表,并将单词与连字符组合起来编码一个数字(基于电子邮件+食盐的散列)。这会更有吸引力,imho:“你的测试代码是秘密袋熊饼干忍者”(我肯定我读过一篇描述一个例子的文章,但我现在找不到它)。

一种方式(C#但代码很简单,可以移植到其他语言):


这样做可以精确控制字母表中的字符。如果您需要加密强度随机性(不太可能),请使用cryto random类生成随机字节(可能修改字母表长度)。

计算能力很便宜,请借鉴您对MD5的想法,在集合上运行您自己设计的“美学”。下面的代码几乎在瞬间生成2000个唯一密钥,这些密钥中没有
0,1,L,O
字符。修改
美学
以符合任何其他标准:

import random,hashlib
def电势_键():
x=random.random()
m=hashlib.md5()
m、 更新(str(x))
s=m.hexdigest().upper()[:16]
返回“%s-%s-%s-%s”%(s[:4],s[4:8],s[8:12],s[12:]
以下各项:
坏字符=[“0”、“1”、“L”、“O”]
对于坏字符中的b:
如果s中有b:返回False
返回真值
key_set=set()
当len(键组)<2000时:
k=潜在的_键()
如果是美学(k):
密钥集。添加(k)
打印密钥集
示例键:

'4297-CAC6-9DA8-625A', '43DD-2ED4-E4F8-3E8D', '4A8D-D5EF-C7A3-E4D5', 
'A68D-9986-4489-B66C', '9B23-6259-9832-9639', '2C36-FE65-EDDB-2CF7', 
'BFB6-7769-4993-CD86', 'B4F4-E278-D672-3D2C', 'EEC4-3357-2EAB-96F5', 
'6B69-C6DA-99C3-7B67', '9ED7-FED5-3CC6-D4C6', 'D3AA-AF48-6379-92EF', ...

将它们从加密PRNG中取出并存储在一个大数据库中如何?使用块大小较小的分组密码(如三重des)对数字1到n进行加密可能是另一种选择。它的优点是您不需要大型数据库。啊哈,这就是标准,谢谢。我一直在考虑做些更酷的东西,但你在互联网上的鼓励促成了交易。制作“官方”外观的测试版密钥可能会让人恼火。这部漫画是你所说的一个很好的例子:是的;我不确定您是否希望在邀请中发送类似于许可证密钥的内容。。。不管怎样,祝你发射好运…太棒了!唯一的问题是,它不能确保生成的每个键都是唯一的(与计数的解决方案相反),我需要不断检查数据库中是否存在可能的重复项。(虽然对于我正在生成的字母表长度=16,字符串中的16个字符=16^16排列,这不太可能生成重复的beta密钥。比2000大一点!如果你能在未来一百万年内生成两个相同的,那是因为不适当地使用了随机类。@TylerJ.Hutchison Che)检查数据库以使其存在应该是一个快速的操作,您甚至可以设置一个唯一的约束来防止意外地放入重复项。
97A8-55E5-C6B8-959E
8C60-6597-B71D-5CAF
8E1B-B625-68ED-107B
A6B5-1D2E-8D77-EB99
5595-E8DC-3A47-0605
'4297-CAC6-9DA8-625A', '43DD-2ED4-E4F8-3E8D', '4A8D-D5EF-C7A3-E4D5', 
'A68D-9986-4489-B66C', '9B23-6259-9832-9639', '2C36-FE65-EDDB-2CF7', 
'BFB6-7769-4993-CD86', 'B4F4-E278-D672-3D2C', 'EEC4-3357-2EAB-96F5', 
'6B69-C6DA-99C3-7B67', '9ED7-FED5-3CC6-D4C6', 'D3AA-AF48-6379-92EF', ...