2017-03-07 49 views
1

问题:我必须生成一个n -digit帐号。为了在对照任何持续性检查之前帮助尽早验证号码,我想验证号码是我们的号码之一。 Luhn Algorithm将验证该号码是否与校验和匹配,但不是该号码的颁发者是有效的。从PHP中生成一个可验证的非序列整数PHP

的如何将(理想地)发生此实施例:

  1. 生成顺序帐号。
  2. 交出连续数占数发生器:

$accountNumber = 1; // doesn't matter, could be random 
$generator = new Generator(getenv('ACCOUNT_SALT')); 
echo $generator->generate($code); // output something like 83463476 

后来:

$badCode = 83463475; // can't be right 
$generator = new Generator(getenv('ACCOUNT_SALT')); 
$generator->validate($badCode); // will return false because the number cannot be reached mathematically based on the salt. 

虽然这是一场野蛮的力量无人防守,它确实给早期验证,并应给予我们非连续的账号。问题是:有没有人知道这样做的算法,如果是的话,他们能举一个例子吗?

+0

谢谢Jay的编辑。 – shrikeh

+0

有趣的问题,但我很可能是最重要的一点困惑 - 你是什么意思的“验证数字*发行人”? –

+0

以一种(非常)基本和不受欢迎的方式,想象一个组织有一天说“我们所有的八位数帐号都是三位数的倍数”。任何通过不能被3整除的表单输入的帐号 - 无需查询数据库 - 显然无效。 – shrikeh

回答

0

最后,我修改了我所见过的用于双因素认证的标准一次性密码实现并使用了它。我们不是使用计数器或计时器,而是使用数字递增顺序,并将其用于基于HMAC的库中,将生成的HMAC转换为“双因子代码”。

有8位数的碰撞,但我们可以放弃那些代。这意味着所有帐户都是非顺序的,而且,如果我们知道生成帐号的原始种子,我们可以在源处快速测试任何帐号的完整性,而不是检入数据库。通过的账号不一定很好,但失败的账号显然不好。

它确实让我怀疑信用卡背面的最后三位数字是否与本系统有某些相似之处,以及发行商之后的前12位数字与此类似。