我需要生成验证码并将其发送给客户,以便客户稍后可以提供验证码并进行验证。我希望能够在不将验证码存储在数据库中的情况下完成此操作,即代码应该是自包含的。
如何生成代码并防止客户猜测有效代码是什么?显然,我不能完全排除一个幸运的猜测,但我希望这样的事件的概率相当小,同时保持代码长度小。代码可能包含数字和字母。
例如,一个非常基本的验证码就是这样:随机生成数字1122
。现在,计算验证码11226
(1122
并附加其校验和6=1+1+2+2
)。因此,如果客户发送回11226
我将能够验证它,但当然这很容易被篡改。是否有生成此类代码的方法?
编辑:问题在于,发送验证码的系统和验证验证码的系统是分开的,这两个系统之间没有共享信息。即使是随机生成的数字(示例中为1122
)也无法为验证系统所知。让我再举一个例子:在我的国家,有一个名为“橙色星期三”的东西。如果您有通过短信收到的代码,您可以获得2张电影票的价格(如果您是Orange客户,则发送短信并通过短信接收代码)。但是,此代码与任何内容(电话号码或类似内容)无关:我可以将代码提供给其他人,但仍然有效。我需要这种验证码。
答案 0 :(得分:8)
您正在寻找的内容可以使用Message Authentication Codes (MAC)实现:
要做的主要观察是:
(message, MAC)
元组的给定修改可能产生的影响。在您的方案中,您可以使用任意消息,因为您唯一的要求是验证您从客户收到的输入最初是由您生成的。 你可以通过
来做到这一点012345679xxxxxxx
开头的代码,或者只是将编码为“dd.mm.yyyy hh:mm:ss”的日期作为“任意消息”。答案 1 :(得分:1)
您可以使用公钥加密技术对客户的姓名进行数字签名(例如)。在您的服务器上,您将存储一个私人签名密钥,客户将发送给您进行注册。在那里,您可以签名并将其发回给客户。验证代码将归结为根据您的公钥检查签名。当然,这无法阻止诸如欺骗其他客户信息之类的内容,但至少它会证明对于任何给定的客户名称,您是否对其进行了授权 - 而且您不需要存储所有客户的庞大数据库(虽然你不想存储数据库的原因超出了我的范围,因为你可能至少需要所有这些数据来保存法律/财务记录。)
答案 2 :(得分:1)
您的建议是使用check digit。问题是系统可以“计算出来”,并且相当容易生成新的工作代码。拥有一个数据库可以让你跟踪已经发出的代码,并确保返回给你的代码实际上已经发出。还可以从上面的维基百科文章的链接部分查看Luhn's algorithm。