生成可以在以后验证的随机代码

时间:2011-09-01 09:01:06

标签: algorithm random cryptography verification

我需要生成验证码并将其发送给客户,以便客户稍后可以提供验证码并进行验证。我希望能够在不将验证码存储在数据库中的情况下完成此操作,即代码应该是自包含的。

如何生成代码并防止客户猜测有效代码是什么?显然,我不能完全排除一个幸运的猜测,但我希望这样的事件的概率相当小,同时保持代码长度小。代码可能包含数字和字母。

例如,一个非常基本的验证码就是这样:随机生成数字1122。现在,计算验证码112261122并附加其校验和6=1+1+2+2)。因此,如果客户发送回11226我将能够验证它,但当然这很容易被篡改。是否有生成此类代码的方法?

编辑:问题在于,发送验证码的系统和验证验证码的系统是分开的,这两个系统之间没有共享信息。即使是随机生成的数字(示例中为1122)也无法为验证系统所知。让我再举一个例子:在我的国家,有一个名为“橙色星期三”的东西。如果您有通过短信收到的代码,您可以获得2张电影票的价格(如果您是Orange客户,则发送短信并通过短信接收代码)。但是,此代码与任何内容(电话号码或类似内容)无关:我可以将代码提供给其他人,但仍然有效。我需要这种验证码。

3 个答案:

答案 0 :(得分:8)

您正在寻找的内容可以使用Message Authentication Codes (MAC)实现:

MAC algorithm

要做的主要观察是:

  1. 生成并验证MAC代码需要密钥(只有您知道)。
  2. 生成的MAC代码是防止修改的,即攻击者无法判断对(message, MAC)元组的给定修改可能产生的影响。
  3. 除了密钥之外,不需要在消息流之外存储任何信息。
  4. 在您的方案中,您可以使用任意消息,因为您唯一的要求是验证您从客户收到的输入最初是由您生成的。 你可以通过

    来做到这一点
    • 解决某种模式,例如只生成以012345679xxxxxxx开头的代码,或者只是将编码为“dd.mm.yyyy hh:mm:ss”的日期作为“任意消息”。
    • 使用足够长的随机数并存储您实际生成的代码。但是,您似乎在寻找不依赖于数据库的解决方案。

答案 1 :(得分:1)

您可以使用公钥加密技术对客户的姓名进行数字签名(例如)。在您的服务器上,您将存储一个私人签名密钥,客户将发送给您进行注册。在那里,您可以签名并将其发回给客户。验证代码将归结为根据您的公钥检查签名。当然,这无法阻止诸如欺骗其他客户信息之类的内容,但至少它会证明对于任何给定的客户名称,您是否对其进行了授权 - 而且您不需要存储所有客户的庞大数据库(虽然你不想存储数据库的原因超出了我的范围,因为你可能至少需要所有这些数据来保存法律/财务记录。)

答案 2 :(得分:1)

您的建议是使用check digit。问题是系统可以“计算出来”,并且相当容易生成新的工作代码。拥有一个数据库可以让你跟踪已经发出的代码,并确保返回给你的代码实际上已经发出。还可以从上面的维基百科文章的链接部分查看Luhn's algorithm

相关问题