【问题标题】:Generating a short, pseudo-random verifiable alpha numeric code生成一个短的、伪随机的可验证字母数字代码
【发布时间】:2016-03-16 17:36:09
【问题描述】:

我有一种情况,我需要生成简短的伪随机字母数字标记,这些标记是唯一的、可验证的,并且可以由人类轻松键入。这些将从 Web 应用程序生成。代币不需要高度安全——它们被用于愚蠢的网络游戏中以获取愚蠢的奖品。由于各种原因,客户希望这些令牌是人类可读的并通过电子邮件进行处理。这是没有商量余地的(我知道......但出于我无法控制的原因,这是必须的)。

换句话说,假设我们得到代码“ABCDE12345”

  • 必须有办法说“ABCDE12345”是“有效的”。例如:开始运行我编写的算法时,可能有两三个字符会生成正确的剩余字符序列。例如,f("AB")==="CDE12345"

  • 玩游戏的两个人不应该生成相同的令牌。在我看来,我很乐意使用以毫秒为单位的当前时间 + 游戏角色名称和分数来播种自制 RNG。 (也就是说,不要使用 Math.random,因为这是一个网络应用程序)。这将为上面提到的两个或三个字符序列播种。

我错过了什么吗?我不是在寻找具体的算法,而是在寻找您的建议。我有什么遗漏吗?

【问题讨论】:

  • 我假设游戏是无状态的,当涉及到代码时? (即它不能存储已知生成的代码)?
  • 游戏在服务器意义上是无状态的。话虽如此,它使用 localStorage 将角色、分数等保存在玩家的设备上。
  • 你有没有设法解决这个问题?
  • 我做到了!但这是 5 年和 2 份工作前的事......我不记得我最终是如何解决它的,只是这里的讨论让我走上了一条好路。

标签: javascript algorithm random token


【解决方案1】:

如果您认为您的令牌可与一条经过验证的消息相提并论“给这个人一个奖品”,您可以查看https://en.wikipedia.org/wiki/Hash-based_message_authentication_code,并根据需要重新编码,例如https://en.wikipedia.org/wiki/Base64 使东西可打印。当然,HMAC 使用一个秘密密钥,您必须对其进行保密。公钥签名系统不需要您对密钥保密,但我希望签名更长,如果您想要非平凡的安全性,我预计它对您来说已经太长了。

【讨论】:

    【解决方案2】:

    一个简单的解决方案(并且易于破解)是生成一个有意义的术语(实现此目的的一种方法是从维基百科中随机选择一篇文章),encrypt 它使用预先知道的密码,并取最不重要的x 位。

    现在,您生成的密钥是word-<x bits as a number>

    这很容易被机器验证,只需重新编码单词并检查位是否合适,并提供可读性与安全性的简单权衡(更大的 x -> 可读性差,更难伪造)。

    但这种方法的主要问题是,假设您的游戏没有与任何服务器通信,您需要以某种方式将预共享密钥部署到您的客户端,并且他们将能够对其进行逆向工程。

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2011-01-29
      • 2014-01-20
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多