一尘不染

如何生成验证码/号码?

algorithm

我正在开发一个应用程序,其中用户必须拨打电话并用手机的键盘输入验证码。

我希望能够检测到他们键入的数字是否正确。电话系统无法访问有效号码列表,但会根据算法(例如信用卡号)验证号码。

以下是一些要求:

  • 键入有效的随机码一定很困难
  • 输入错字(数字换位,数字错误)一定很难获得有效的代码
  • 我必须有合理数量的可能组合(例如1M)
  • 该代码必须尽可能短,以避免用户输入错误

鉴于这些要求,您将如何生成这样的数字?

编辑:

@Haaked:该代码必须为数字,因为用户使用其手机进行了键入。

@matt b:第一步,代码显示在网页上,第二步是调用并键入代码。我不知道用户的电话号码。

后续:我发现了几种算法来 检查 数字的有效性(请参阅此有趣的Google
Code项目:checkDigits)。


阅读 234

收藏
2020-07-28

共1个答案

一尘不染

经过研究,我认为我将采用 ISO 7064 Mod 97,10 公式。由于它用于验证IBAN(国际银行帐号),因此看起来非常可靠。

公式很简单:

  1. 取一个数字: 123456
  2. 应用以下公式来获得2位数的校验和: mod(98 - mod(number * 100, 97), 97) => 76
  3. Concat编号和校验和以获得代码=> 12345676
  4. 要验证代码,请验证 mod(code, 97) == 1

测试:

  • mod(12345676, 97) = 1 =>好
  • mod(21345676, 97) = 50 =>不好!
  • mod(12345678, 97) = 10 =>不好!

显然,该算法捕获了大多数错误。

另一个有趣的选择是Verhoeff算法。它只有一个验证码,并且难以实现(与上面的简单公式相比)。

2020-07-28