2016-03-16 74 views
0

我有一个情况我需要生成短伪随机的字母数字标记,其是唯一的,可核查,并且容易由人型能够。这些将从Web应用程序中生成。这些令牌不需要非常安全 - 它们被用于愚蠢的网页游戏中,以获得一个愚蠢的奖品。由于各种原因,客户希望这些令牌具有人类可读性,并通过电子邮件进行处理。这是不可谈判的(我知道......但这是因为我无法控制的原因)。生成短的,伪随机可验证字母数字代码

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

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

  • 两个人玩游戏不应该是可能产生同样的道理。在我看来,我很乐意用毫秒+游戏角色名称&得分来打造自制的RNG。 (也就是说,不要使用Math.random,因为这是一个Web应用程序)。这将播种上述的两个或三个字符序列。

我是否缺少任何东西?我不是在寻找一个具体的算法,而是你的建议。我错过了什么?

+0

我假设游戏是无状态的,当它涉及到的代码? (即它不能存储已知的生成代码)? – amit

+0

游戏在服务器意义上是无状态的。这就是说,它使用localStorage在玩家的设备上保留角色,得分等。 – TomorrowPlusX

回答

0

一个简单的解决方案(并容易破解)将产生一个有意义的术语(一种方法来实现这样的是从维基百科选择一个随机文章),encrypt它与一个预先知道的密码,并采取最不重要的x位。现在

,你生成密钥是word-<x bits as a number>

这很容易通过机器验证,只需重新编码该单词并检查这些位是否合适,并提供了可读性与安全性(更大的x - >可读性更低,更难以伪造)之间的简单折衷。

这种方法虽然是假设你的游戏是不与任何服务器通信的主要问题,您将需要以某种方式部署预共享密钥给您的客户,他们将能够逆向工程了。

1

如果你认为你的令牌相当于一个认证的消息说:“给这个人奖”你可以看看https://en.wikipedia.org/wiki/Hash-based_message_authentication_code,重新编码与如必要https://en.wikipedia.org/wiki/Base64使这个东西可打印。当然,HMAC使用一个秘密密钥,你必须保密。公钥签名系统不需要你保存密钥的秘密,但我希望签名更长,如果你想要非平凡的安全性,我认为它已经太长了。