用于检测信用卡号的算法减少误报/负数

Posted

技术标签:

【中文标题】用于检测信用卡号的算法减少误报/负数【英文标题】:Algorithms for detecting Credit Card Number reducing false positives/negatives 【发布时间】:2013-09-21 10:23:41 【问题描述】:

我想创建一种算法,可以从各种类型的文件中检测信用卡号 (CCN)。

如何查找 CCN 的简单方案是使用定义的正则表达式:

    Visa:^4[0-9]12(?:[0-9]3)?$所有Visa卡号都以a开头 4。新卡有 16 位数字。旧卡有 13 个。 万事达卡:^5[1-5][0-9]14$ 所有万事达卡号码都以 号码5155。都有 16 位数字。 美国运通:^3[47][0-9]13$美国运通卡号 以3437 开头,有15 位数字。 大来卡:^3(?:0[0-5]|[68][0-9])[0-9]11$大来卡 数字以3003053638 开头。都有 14 位数字。 有些大来卡以5 开头,有16 位数字。 这些是 Diners Club 和 MasterCard 的合资企业,以及 应该像万事达卡一样处理。 发现:^6(?:011|5[0-9]2)[0-9]12$发现卡号开始 与601165。都有 16 位数字。 JCB:^(?:2131|1800|35\d3)\d11$2131 开头的 JCB 卡或 1800 有 15 位数字。以35 开头的 JCB 卡有 16 位数字。

然后我们可以用 Luhn Mod-10 算法检查找到的数字,如果它满足条件,我们可以说我们找到了 CCN。

但根据我的经验,这种简单的方法有很多误报/误报。

可以使用哪些算法或启发式方法来减少误报/误报匹配? PCI Data Finder 或 Card Recon 等高级软件提供了更可靠的结果,而这些结果绝对不是通过简单的正则表达式查找和 Luhn 检查来实现的。

【问题讨论】:

如果您只获取所有 15/16 位数字(省略连字符)并检查它们,究竟出了什么问题?似乎它可能足够快(与“简单”的正则表达式方法相比)来弥补误报。 【参考方案1】:

您可以使用 BIDB.com 等来源购买 BIN(银行识别号),从而通过仅考虑前六位(或在某些情况下为八位)数字与现有发卡银行匹配的卡来减少误报。

如果您只寻找美国发行的卡,您可以使用相同的方法大幅减少此数量。

【讨论】:

以上是关于用于检测信用卡号的算法减少误报/负数的主要内容,如果未能解决你的问题,请参考以下文章

推荐一款能检测信用卡卡号的有效性类型等信息的JS插件

信用卡号验证 用c++如何解决?

是否有任何有效的信用卡号是其他有效信用卡号的初始子串?

付款完成后获取信用卡号

LUHN 信用卡验证在有效卡号上失败

信用卡欺诈的 Python 算法