【发布时间】: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\d{3})\d{11}$以2131开头的 JCB 卡或1800有 15 位数字。以35开头的 JCB 卡有 16 位数字。
然后我们可以用 Luhn Mod-10 算法检查找到的数字,如果它满足条件,我们可以说我们找到了 CCN。
但根据我的经验,这种简单的方法有很多误报/误报。
可以使用哪些算法或启发式方法来减少误报/误报匹配? PCI Data Finder 或 Card Recon 等高级软件提供了更可靠的结果,而这些结果绝对不是通过简单的正则表达式查找和 Luhn 检查来实现的。
【问题讨论】:
-
如果您只获取所有 15/16 位数字(省略连字符)并检查它们,究竟出了什么问题?似乎它可能足够快(与“简单”的正则表达式方法相比)来弥补误报。
标签: regex algorithm credit-card luhn credit-card-track-data