问题:我必须生成 n -digit帐号。为了在检查数字与任何持久性之前帮助尽早验证数字,我想验证这个号码是否属于我们的号码。 Luhn Algorithm将验证该数字是否与校验和匹配,但不是该数字的发布者有效。
如何(理想情况下)发生这种情况的示例:
$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 :(得分:0)
最后,我修改了我在双因素身份验证中看到的标准一次性密码实现并使用了它。我们不是使用计数器或计时器,而是使用顺序递增的数字,并在基于HMAC的库中使用它,将生成的HMAC转换为"双因子代码"。
有8位数的碰撞,但是我们可以丢弃那些来自世代的。这意味着所有帐户都是非顺序的,并且,如果我们知道生成帐号的原始种子,我们可以快速测试任何帐号以确保源的完整性,而不是检入数据库。通过的帐号不一定好,但失败的帐号显然是坏的。
它确实让我想知道信用卡背面的最后三位数字是否与这个系统有某种相似之处,而发行人之后的前面的12位数字是否类似于此。