1

介绍

我正在为我的网站使用“奖品代码”系统:管理员可以将积分分配给用户,给他们一个可以兑换的代码。
这个想法本身很容易实现:生成(我假设算法很难预测)代码,将它们存储在安全的数据库中,并让管理员有权读取一个随机代码。但我发现我想要的一些功能确实会发生冲突:

  1. 代码必须以合理的计算能力合理地抵抗攻击;
  2. 必须有大量的代码,100万;
  3. 代码必须易于键入。

我想到了这些解决方案,直到现在:

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

问题 1

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

问题2

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

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

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

4

1 回答 1

2

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

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

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

使用n单词,您将获得 log₂((4​​000 到 6000)ⁿ) 位。为简单起见,假设您选择了 4096 个单词的字母表。要包含与 144 位标记相同数量的信息,您的短语将需要每个包含 12 个单词。

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

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

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

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

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

如果你想减轻这种情况,你可以使用一个统计模型来了解某些单词在文本语料库(例如,一组文献)中彼此相邻出现的频率,以使单词序列看起来很自然一个人。对相邻单词的相邻部分、三元组或四元组进行建模分别称为第二、第三或 n 级马尔可夫链

显然,生成这样的短语将减少短语中的信息量(在信息论意义上),因此您必须通过延长它们来进行补偿。使用特定统计模型导致的信息减少的确切数量留作练习供您计算:-)

于 2012-09-06T22:11:23.200 回答