Регулярное выражение для данных отслеживания кредитной карты - PullRequest
12 голосов
/ 30 марта 2010

Существуют ли какие-либо известные регулярные выражения для проверки данных дорожки кредитной карты 1 и дорожки 2?

EDIT:

Из Википедия :

Информация о дорожке 1 на финансовых картах содержится в нескольких форматах: A, который зарезервирован для собственного использования эмитентом карты, B, который описан ниже, CM, который зарезервирован для использования Подкомитетом ANSI X3B10 и NZ , которые доступны для использования отдельными эмитентами карт:

Трек 1 , формат B:

  • Стартовый страж - один символ (обычно '%')
  • Формат кода = "B" - один символ (только альфа) * ​​1018 *
  • Основной номер счета (PAN) - до 19 символов. Обычно, но не всегда, совпадает с номером кредитной карты, напечатанным на лицевой стороне карты.
  • Разделитель полей - один символ (обычно '^')
  • Имя - от двух до 26 символов
  • Разделитель полей - один символ (обычно '^')
  • Срок годности - четыре символа в форме ГГММ.
  • Сервисный код - три символа
  • Дискреционные данные - могут включать в себя ключевой индикатор проверки PIN (PVKI, 1 символ), значение проверки PIN (PVV, 4 символа), значение проверки карты или код проверки карты (CVV или CVK, 3 символа)
  • Конечный страж - один символ (обычно '?')
  • Проверка продольной избыточности (LRC) - это один символ и символ достоверности, рассчитанный на основе других данных на дорожке. Следует отметить, что большинство считывающих устройств не возвращают это значение при переносе карты на уровень представления и используют его только для внутренней проверки считывателя.

Трек 2 : Этот формат был разработан банковской индустрией (ABA). Этот трек написан по 5-битной схеме (4 бита данных + 1 контроль четности), которая допускает шестнадцать возможных символов, которые являются числами 0-9, плюс шесть символов:; <=>? , Выбор шести знаков пунктуации может показаться странным, но на самом деле шестнадцать кодов просто отображаются в диапазон ASCII от 0x30 до 0x3f, который определяет десять цифровых символов плюс эти шесть символов. Формат данных следующий:

  • Стартовый страж - один символ (обычно ';')
  • Основной номер счета (PAN) - до 19 символов. Обычно, но не всегда, совпадает с номером кредитной карты, напечатанным на лицевой стороне карты.
  • Разделитель - один символ (обычно '=')
  • Срок годности - четыре символа в форме ГГММ.
  • Сервисный код - три символа
  • Дискреционные данные - как в первой дорожке
  • Конечный страж - один символ (обычно '?')
  • Проверка продольной избыточности (LRC) - это один символ и символ достоверности, рассчитанный по другим данным на дорожке. Следует отметить, что большинство считывающих устройств не возвращают это значение при переносе карты на уровень представления и используют его только для внутренней проверки считывателя.

Ответы [ 5 ]

10 голосов
/ 20 ноября 2013

Вот REGEX, который помогает мне выбрать дорожку 1 и дорожку 2. Используйте это с опцией регулярного выражения "Точка НЕ ​​соответствует символу новой строки".

^%(?<FC>.)(?<PAN>[\d]{1,19}+)\^(?<NM>.{2,26})\^(?<ED>[\d]{0,4}|\^)(?<SC>[\d]{0,3}|\^)(?<DD>.*)\?|;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z

Я проверил с этими данными (мой читатель читает записи дорожки 1 и дорожки 2, в этом порядке, для той же карточки, с которой я проверял - номера и имя были изменены ниже.)

%B5581123456781323^SMITH/JOHN^16071021473810559010203?
;5581123456781323=160710212423468?

Вышеуказанный REGEX использует NAMED CAPTURE GRUPS («?», Который начинается с каждой (группы)), и я вижу результат (с RegexBuddy) как:

Match 1:    %B5581123456781323^SMITH/JOHN^16071021473810559010203?       0      54
Group "FC": B        1       1
Group "PAN":    5581123456781323         2      16
Group "NM": SMITH/JOHN      19      10
Group "ED": 1607        30       4
Group "SC": 102     34       3
Group "DD": 1473810559010203        37      16

Match 2:    ;5581123456781323=160710212423468?      56      34
Group "FC" did not participate in the match
Group "PAN":    5581123456781323        57      16
Group "NM" did not participate in the match
Group "ED": 1607        74       4
Group "SC": 102     78       3
Group "DD": 12423468        81       8

Обратите внимание, что второе совпадение НЕ идентифицирует FC (код формата) и NM (имя) в дорожке 2 (совпадение 2), поскольку они не используются в дорожке 2.

Если ваш движок регулярных выражений не поддерживает NAMED GROUPS, просто убейте "?" часть каждой из групп захвата. Затем используйте положение для определения каждой группы.

Кроме того, мой единственный SWIPE содержит ОБА дорожку 1 и дорожку 2 (в этом порядке дорожка 1, crlf, а затем дорожка 2). Согласно ссылке на Википедию в исходном вопросе, карточки могут иметь до 3 дорожек, и читатели могут читать дорожки 1 и 2 как (или одну, так и другую) и редко дорожку 3.

По этой причине я думаю, что безопаснее использовать REGEX, который ищет как дорожку 1, так и дорожку 2, и если вы получаете обе, вы можете игнорировать дорожку 2 (так как дорожка 1 имеет больше данных) или что угодно.

Поскольку обе дорожки присутствуют в моих пролистываниях, движок REGEX вернет 2 совпадения с моим REGEX выше (при условии отсутствия ошибки чтения из считывателя и считывателя, который поддерживает обе дорожки). В моем случае это меня не беспокоит, и я просто планирую использовать «первое совпадение» и игнорировать второе.

Если вас интересует только трек 1, используйте это регулярное выражение:

^%(?<FC>.)(?<PAN>[\d]{1,19}+)\^(?<NM>.{2,26})\^(?<ED>[\d]{0,4}|\^)(?<SC>[\d]{0,3}|\^)(?<DD>.*)\?\Z

Если вас интересует только дорожка 2, используйте регулярное выражение:

^;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z

Но я не вижу вреда в проверке обоих, а затем в использовании первого полученного вами или, возможно, сравнения дорожки 1 с дорожкой 2 в качестве дополнительного шага проверки ошибок.

Извините, что отвечаю на то, что кажется ответом!

2 голосов
/ 30 марта 2010

Я собирался опубликовать ту же ссылку на регулярном экспресс-сайте.info для проверки части номера трека.

Теперь самое сложное. Данные трека различаются по формату между эмитентами карт и даже кард-ридерами. Например, символы «разделитель» не всегда одинаковы. То же относится и к концу «стражей».

Википедия дает хороший обзор: http://en.wikipedia.org/wiki/Magnetic_stripe_card

В случае дорожки 2 за номером карты следует знак «=» (или иногда «D»). Тогда у вас есть дата истечения срока действия как MMDD. После этого у Track2 есть «дискреционные данные», которые могут быть чем угодно.

Я бы не стал слишком беспокоиться после этого. Если это данные трека, вы уже будете уверены. Я думаю, это зависит от того, что вы собираетесь делать с данными.

В любом случае, для Track2 вы могли бы сделать намного хуже, чем добавить [= D] [0-9] {4} вместо $ в конце регулярного выражения cc:

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})[=D][0-9]{4}

Для track1 вы могли бы сделать нечто подобное ... Track1 содержит больше переменных данных, поэтому может быть немного сложнее.

Удачи!

2 голосов
/ 30 марта 2010

Следующие два регулярных выражения, кажется, проверяют данные дорожки 1 и дорожки 2. Обратите внимание, что эти регулярные выражения предполагают, что используемые символы «обычно» используются в информации Википедии выше.

Track 1:  ^%B\d{0,19}\^[\w\s\/]{2,26}\^\d{7}\w*\?$

Предполагается, что% и? являются сторожевыми символами, а ^ используется как символ-разделитель полей. Также предполагается, что номер счета, дата и код обслуживания являются цифрами.

Track 2:  ;\d{0,19}=\d{7}\w*\?

Предполагает, что; а также ? являются сторожевыми символами, а = = символом разделителя полей. Также предполагается, что номер счета, дата и код обслуживания являются цифрами.

Я протестировал эти выражения, используя данные дорожки, считанные с карт-ридера MagTek. Следующие два набора данных треков соответствуют тому, что было прочитано читателем, и проверяются по двум регулярным выражениям выше (числа явно были изменены):

%B1234567891234567^SMITH/JOHN                ^15024041234567891234?
;1234567891234567=152024041234567891234?
1 голос
/ 30 марта 2010

дорожка 1, формат B переводится как

^%B[^\^\W]{0,19}\^[^\^]{2,26}\^\d{4}\w{3}[^?]+\?\w?$

с некоторыми предположениями относительно того, что составляет действительный символ.

Конечно, нет никаких проверок, являются ли данные действительно значимыми, и LRC (если присутствует) также не может быть проверен.

Можете ли вы сравнить это с некоторыми реальными данными и посмотреть, работает ли это?

Трек 2 переводится в

;[^=]{0,19}=\d{4}\w{3}[^?]+\?\w?
0 голосов
/ 22 апреля 2017

Примечание. Номер счета в track1 может содержать пробелы для карт American Express. Итак:

^%(?.)(?[\d\s]{1,19}+)\^(?.{2,26})\^(?[\d]{0,4}|\^)(?[\d]{0,3}|\^)(?.*)\?|;(?[\d]{1,19}+)=(?[\d]{0,4}|=)(?[\d]{0,3}|=)(?.*)\?\Z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...