Я хотел бы создать алгоритм, который мог бы определять номера кредитных карт (CCN) из различных типов файлов.Алгоритмы определения количества кредитных карт, уменьшающие ложные срабатывания/негативы
Простой сценарий, как найти CCNS является использование регулярных выражений, как определенно:
- Visa: номер
^4[0-9]{12}(?:[0-9]{3})?$
Всех Visa карт начинаются с4
. Новые карты имеют 16 цифр. Старые карточки имеют 13. - MasterCard:
^5[1-5][0-9]{14}$
Все номера MasterCard начинаются с цифр51
по55
. Все имеют 16 цифр. - American Express:
^3[47][0-9]{13}$
Номер карты American Express начинаются с34
или37
и имеют 15 цифр. - Diners Club:
^3(?:0[0-5]|[68][0-9])[0-9]{11}$
Diners Club карты номера начинаются с300
через305
,36
или38
. Все имеют 14 цифр. Карты Diners Club начинаются с5
и имеют 16 цифр. Это совместное предприятие Diners Club и MasterCard, а должно обрабатываться как MasterCard. - Обнаружение:
^6(?:011|5[0-9]{2})[0-9]{12}$
Открытие номеров карт начинается с6011
или65
. Все имеют 16 цифр. - JCB:
^(?:2131|1800|35\d{3})\d{11}$
Карты JCB, начинающиеся с2131
или1800
имеют 15 цифр. Карты JCB, начинающиеся с35
, имеют 16 цифр.
Затем мы можем проверить найденное число с помощью алгоритма Luhn Mod-10, и если он удовлетворяет условиям, мы можем сказать, что мы нашли CCN.
Но этот простой метод имеет очень большое количество ложных срабатываний/негативов из моего опыта.
Какие алгоритмы или эвристики могут использоваться для уменьшения совпадений ложных срабатываний/негативов? Расширенное программное обеспечение, такое как PCI Data Finder или Card Recon, обеспечивает более надежные результаты и что результаты, безусловно, не достигаются путем простого поиска регулярных выражений и проверки Luhn.
Что именно происходит не так, если вы просто хватаете все цифры 15/16 цифр (опуская дефисы) и проверяете их? Кажется, что он может быть достаточно быстрым (по сравнению с «простым» методом регулярных выражений), чтобы компенсировать ложные срабатывания. – Geobits