我想创建一种算法,可以从各种类型的文件中检测信用卡号 (CCN)。
如何查找 CCN 的简单场景是使用定义的正则表达式:
- Visa:
^4[0-9]{12}(?:[0-9]{3})?$
所有 Visa 卡号均以 . 开头4
。新卡有 16 位数字。老牌有13张。 - 万事达卡:所有万事达卡号码都以
^5[1-5][0-9]{14}$
数字开头。都有 16 位数字。51
55
- 美国运通:
^3[47][0-9]{13}$
美国运通卡号以34
或开头,37
有 15 位数字。 - Diners Club:
^3(?:0[0-5]|[68][0-9])[0-9]{11}$
Diners Club 卡号300
以305
或36
开头38
。都有 14 位数字。5
有以16 位数字开头的大来卡。这些是大来卡和万事达卡的合资企业,应该像万事达卡一样处理。 - 发现:
^6(?:011|5[0-9]{2})[0-9]{12}$
发现卡号以6011
或开头65
。都有 16 位数字。 - JCB: JCB 卡以或
有 15 位数字
^(?:2131|1800|35\d{3})\d{11}$
开头。以开头的 JCB 卡有 16 位数字。2131
1800
35
然后我们可以用 Luhn Mod-10 算法检查找到的数字,如果它满足条件,我们可以说我们找到了 CCN。
但是根据我的经验,这种简单的方法有很多误报/否定。
可以使用哪些算法或启发式方法来减少误报/误报匹配?PCI Data Finder 或 Card Recon 等高级软件提供了更可靠的结果,而这些结果绝对不是通过简单的正则表达式查找和 Luhn 检查来实现的。