我有一种情况需要生成短的伪随机字母数字标记,这些标记是独特的,可验证的,并且很容易被人类输入。这些将从Web应用程序生成。令牌不需要高度安全 - 它们被用于愚蠢的网络游戏中以获得愚蠢的奖励。由于各种原因,客户希望这些令牌是人类可读的并通过电子邮件处理。这是不可谈判的(我知道......但这是因为我无法控制的原因)。
换句话说,假设我们得到代码“ABCDE12345”
必须有一种方法可以说“ABCDE12345”是“有效的”。例如:在我开始运行算法时,可能会有两到三个字符生成正确的剩余字符序列。例如,{{1}}
玩游戏的两个人不应该生成相同的令牌。在我看来,我很乐意使用当前时间毫秒+游戏角色名称&得分以种植自制RNG。 (也就是说,不使用Math.random,因为这是一个Web应用程序)。这会使上面提到的两个或三个字符序列播种。
我错过了什么吗?我不是在寻找具体的算法,而是在寻找你的建议。我缺少什么?
答案 0 :(得分:1)
如果您认为自己的令牌与经过身份验证的消息“可以为此人提供奖品”相提并论,则可以查看https://en.wikipedia.org/wiki/Hash-based_message_authentication_code,并根据需要重新编码,例如https://en.wikipedia.org/wiki/Base64使事物可打印。当然,HMAC使用一个秘密密钥,您必须保密。公钥签名系统不要求你保密密钥,但我希望签名更长,如果你想要非平凡的安全性,我希望它已经太长了。
答案 1 :(得分:0)
一个简单的解决方案(也很容易入侵)就是生成一个有意义的术语(实现这一目标的一种方法是从维基百科中选择一篇随机文章),encrypt使用预先知道的密码,并采取最低有效x位。
现在,您生成的密钥为word-<x bits as a number>
。
这很容易通过机器验证,只需对单词进行重新编码并检查这些位是否合适,并提供可读性与安全性的简单权衡(更大的x - >可读性更低,更难伪造)。
这种方法的主要问题是假设您的游戏没有与任何服务器通信,您需要以某种方式将预共享秘密部署到您的客户端,并且他们将能够对其进行逆向工程。