用于检测信用卡号的算法减少误报/负数
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$
所有万事达卡号码都以
号码51
到55
。都有 16 位数字。
美国运通:^3[47][0-9]13$
美国运通卡号
以34
或37
开头,有15 位数字。
大来卡:^3(?:0[0-5]|[68][0-9])[0-9]11$
大来卡
数字以300
到305
、36
或38
开头。都有 14 位数字。
有些大来卡以5
开头,有16 位数字。
这些是 Diners Club 和 MasterCard 的合资企业,以及
应该像万事达卡一样处理。
发现:^6(?:011|5[0-9]2)[0-9]12$
发现卡号开始
与6011
或65
。都有 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(银行识别号),从而通过仅考虑前六位(或在某些情况下为八位)数字与现有发卡银行匹配的卡来减少误报。
如果您只寻找美国发行的卡,您可以使用相同的方法大幅减少此数量。
【讨论】:
以上是关于用于检测信用卡号的算法减少误报/负数的主要内容,如果未能解决你的问题,请参考以下文章