php - 从 PHP 中的盐生成可验证的非连续整数

标签 php algorithm signing

问题:我必须生成一个 n 位数的帐号。为了在根据任何持久性检查此号码之前帮助尽早验证该号码,我想验证该号码是我们的号码之一。 Luhn Algorithm将验证该号码是否与校验和匹配,但不会验证该号码的发行者是否有效。

这将如何(理想情况下)发生的示例:

  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.

虽然这不能防御暴力破解,但它确实提供了早期验证并且应该为我们提供非连续的帐号。问题是:有人知道可以执行此操作的算法吗?如果知道,他们能举个例子吗?

最佳答案

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

有 8 位数字的冲突,但我们可以丢弃生成的那些。这意味着所有帐户都是非连续的,并且如果我们知道生成帐号的原始种子,我们可以在源头快速测试任何帐号的完整性,而不是检查数据库。通过的账号不一定好,不通过的账号显然不好。

这确实让我想知道信用卡背面的最后三位数字是否在某种程度上与该系统相似,而正面的发行人之后的 12 位数字是否与此类似。

关于php - 从 PHP 中的盐生成可验证的非连续整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42650501/

相关文章:

javascript - 如何在数组中输入 5 个元素并打印元素的总和

php - 目标类 [PersonTableSeeder] 不存在

php - 为什么 UTF-8 在我的一个 PHP 文件中有效,而在另一个文件中无效?

algorithm - 单纯形法/线性规划帮助

ios - iOS 应用程序中的 Android keystore 摘要等效项是什么

php - 如何计算特定数组值并在表数据中分配值

sql - 最大计数范围交集(在 T-SQL 中)

algorithm - 寻求有效的算法来分析类似于VBA中数据透视表的数据

jwt - 将 JWT SigningKey 存储在 Java KeyStore 中

google-chrome - 绕过 Chrome 的恶意文件警告