这句话是一个好的代码吗?

时间:2012-09-06 21:35:10

标签: security entropy

简介

我正在制作一个奖励代码"我的网站系统:管理员可以为用户分配信用,为他们提供可以兑换的代码 这个想法本身很容易实现:生成(我假设算法难以预测)代码,将它们存储在安全的数据库中,并使管理员有权读取一个随机代码。但我发现我想要的一些功能确实发生了碰撞:

  1. 代码必须合理地抵制以合理的计算能力进行攻击;
  2. 必须有大量代码,100万;
  3. 代码必须易于输入。
  4. 我想到了这些解决方案,直到现在:

    经过一番思考,我想出了这个解决方案:使用N个单词的短语[我不是在谈论THE" n"字。我的意思是," N次随机词"]。这似乎是一个好主意,但我在这个领域没有经验。

    问题1

    使用代码短语是否安全?如果是,为了足够安全,我应该使用多少个单词? [假设平均长度和8岁儿童知道的话。]

    问题2

    给出一个单词列表,将它们存储到数据库中的最佳方法是什么?

    • 桌面端,生成一个包含所需短语的文件,然后使用PHP读取并将它们放入数据库?
    • 服务器端,读取单词列表并将短语直接写入数据库?
    • 其他方式?

    请注意,我不能让管理员阅读短语文件,因为编码比使用数据库更难。还要注意这些词必须是普通的意大利语:我估计要使用4.000到6.000个单词。

1 个答案:

答案 0 :(得分:2)

我将假设您的代码将从适当的(伪)随机数生成。如果生成大量的熵,请确保为生成它们的计算机的随机数生成器提供足够的熵。

您所谈论的代码通常被创建为随机可打印字符的字符串。例如,一种方法是生成一个144位的随机数并对其进行base64编码。这将为您提供144位信息,包含24个字符的字符串。通常人们不介意将字符串读作垃圾,因为它们要么是复制和粘贴,要么嵌入到URL中。您可以将此字符串视为24个符号的序列,每个符号由64个字符的字母表生成,或者作为144个符号的序列,每个符号由2位字母表生成。它也是一样的。

生成WORDS列表而不是CHARACTERS(或BIT)列表是类似的。您使用的是4000到6000个字母的字母,而不是2位或64个字符的字母。这是一个更大的字母表(更多信息),但你希望在你的短语中使用更少的或更少的信息(更少的信息)。

使用n个字,你会得到log 2((4000到6000)bits)位。为简单起见,假设您选择了4096个单词的字母表。要包含与144位令牌相同数量的信息,您的短语将需要包含12个单词。

您的要求“必须有大量代码,100万”尚不清楚。你的意思是代码空间必须是100万个短语,或者你打算生成100万个不同的短语,这些短语都是代码空间中更大的一部分。

如果你的代码空间需要100万,那就只有log 2(1000000)= 20位。 2个单词的短语会做。我想这可能是一个很小的代码空间...但它取决于对手可能有多少机会猜测正确的短语以及它们能够多快地进行猜测。它还取决于对手猜测正确代码的破坏程度。在不知道您的要求的情况下,我只能猜测您想拥有多大的代码空间。也许是两位(1万亿个代码)的两倍?

问题2:只要执行此类短语的计算机具有良好的随机性来源,您生成短语的位置就没有任何区别。如有疑问,请使用您的桌面。然后,将它们加载到数据库中的方式并不重要,无论是RPC,远程数据库访问还是将文件复制到服务器。

如果您生成了很多短语,请注意将它们作为普通字符串存储在数据库中将会很昂贵。您可以通过将它们编码为整数序列来节省大量空间,这些整数是参考词表中的索引。

EXTRA :请注意,如果您在每个短语中使用2个或3个以上的单词,您可能会发现这些短语难以记忆并输入为随机字符序列。这是因为即使它们由真实的单词组成,这些短语也大多是无意义的,包括语法上不能彼此相邻的单词。

如果你想减轻这个问题,你可以使用一个统计模型来确定某些单词在文本语料库(例如,文献集合)中彼此相邻的频率,以便制作可能会出现的单词序列。对人类来说似乎很自然。对邻近部分,三元组或相邻单词的4元组建模分别称为第二级,第三级或n级Markov chains

显然,生成这样的短语会减少你的短语中的信息量(在信息理论意义上),所以你必须通过延长它们来补偿。使用特定统计模型导致的确切信息减少量留给您进行计算: - )