引言
我正在为我的网站工作一个“奖励代码”系统:管理员可以给一个用户分配积分,给他们一个他们可以赎回的代码。
这个想法本身很容易实现:生成(我认为算法很难预测)代码,将它们存储在一个安全的数据库中,并赋予管理员读取一个随机代码的权力。但我发现我想要的一些特征确实会发生碰撞:
我想到了这些解决方案,直到现在:
经过一番思考,我想出了一个解决方案:使用N个词的短语,我不是在说"n“字。我是说,"N倍随机词“。这似乎是个好主意,但我在这个领域没有经验。
问题1
密码用短语安全吗?如果是,为了足够安全,我应该用几个单词?假设平均长度和一个8岁的孩子知道的话。
问题2
给出一个单词列表,将它们存储到数据库中的最佳方法是什么?
请注意,我不能仅仅让管理员读取短语文件,因为它比使用数据库更难编码。还请注意,这些词必须是意大利语:我估计要使用的单词在4.000到6.000之间。
发布于 2012-09-06 22:11:23
我将假设你的代码是由适当的(伪)随机数产生的。如果你产生了很多它们,请确保为产生它们的计算机的随机数生成器提供足够的熵。
像您所说的代码通常是作为随机可打印字符的字符串创建的。例如,一种方法就是生成一个144位的随机数并对其进行base64 64编码。这将为您提供144位信息,字符串为24个字符。通常,人们并不介意字符串被当作垃圾读取,因为它们要么是复制和粘贴的,要么是嵌入在URL中的。你可以把这个字符串想象成一个由24个符号组成的序列,每个符号由64个字符的字母表生成,或者144个符号的序列,每个符号由2位的字母表生成。结果是一样的。
生成一个单词列表而不是一个字符(或位)列表是类似的。而不是使用2位或64个字符的字母表,而是使用4000到6000字的字母表。这是一个更大的字母表(更多的信息),但你希望在你的短语中使用更少的或它们(更少的信息)。
使用n单词,您将得到日志₂((4000到6000)ⁿ)位。为了简单起见,假设您选择4096个单词的字母表。要包含与144位标记相同的信息量,您的短语需要每个包含12个单词。
您的要求“必须有大量的代码,100万”是不清楚的。您的意思是代码空间必须是100万个短语,还是意味着要生成100万个不同的短语,这些短语是代码空间的每个部分都要大得多。
如果您的codespace需要100万,那就是日志₂(1000000)= 20位。两个字的短语就行了。我想那可能有点小代码空间..。但这取决于一个对手有多少机会能够猜出正确的短语,以及他们能够多快地做出猜测。这也取决于对手猜出正确的代码会有多大的伤害。在不知道您的需求的情况下,我只能猜测您希望拥有多大的codespace。可能是比特数的两倍(1万亿码)?
问题2: --只要计算机有很好的随机性来源,生成短语的地方就没有任何区别。如果有疑问,请使用桌面。然后,不管您如何将它们加载到数据库中,无论是RPC、远程数据库访问,还是将文件复制到服务器,都无关紧要。
如果您生成了大量的短语,请注意,将它们作为普通字符串存储在数据库中将是非常昂贵的。您可以通过将它们编码为索引到引用字列表中的整数序列来节省大量空间。
:请注意,如果在每个短语中使用超过2个或3个单词,您可能会发现这些短语与随机字符序列一样难以记忆和键入。这是因为,即使它们是由真正的单词组成的,这些短语大多是无稽之谈,包括语法上不能相互匹配的单词。
如果你想减轻这一点,你可以使用一个统计模型,说明某个词在一个文本语料库(例如,一组文献)中出现的频率,以便使单词序列看起来可能对人类来说是自然的。模拟相邻词的相邻部分、三元组或四元组分别称为第二、第三或n级马尔可夫链 .
显然,生成这样的短语会减少短语中的信息量(信息论意义上的),所以你必须通过延长它们来弥补。使用特定统计模型导致的信息减少的确切数量留给您计算:)
https://stackoverflow.com/questions/12308747
复制相似问题