2010-03-29 11 views
12

Czy są jakieś znane wyrażenia regularne służące do sprawdzania ścieżki 1 karty kredytowej i śledzenia 2 danych?Wyrażenie regularne dla danych z kart kredytowych

EDIT:

Od Wikipedia:

Informacje na ścieżce 1 na kartach finansowych zawarte są w kilku formatach: A, która jest zarezerwowana dla własnego użytku emitenta karty, B, który jest opisany poniżej CM, które są zastrzeżone do użytku przez ANSI Podkomisja X3B10 i NZ, które są dostępne do wykorzystania przez poszczególnych emitentów kart:

Track 1, Format B:

  • start sentinel - jeden znak (zazwyczaj '%')
  • Kod format = "B" - jedna postać (alfa tylko)
  • numer konta
  • Primary (PAN) - maksymalnie 19 znaków. Zazwyczaj, ale nie zawsze, odpowiada numerowi karty kredytowej wydrukowanemu na przedniej stronie karty.
  • Pole Separator - jeden znak (zazwyczaj '^')
  • Nazwa - od dwóch do 26 znaków
  • Pole separatora - jedna postać (ogólnie '^')
  • data ważności - cztery znaki w YYMM formularza.
  • Kod usługi - trzy znaki
  • Dyskretyzacja - może zawierać kluczowy wskaźnik weryfikacji PIN (PVKI, 1 znak), wartość weryfikacji PIN (PVV, 4 znaki), wartość weryfikacji karty lub kod weryfikacji karty (CVV lub CVK, 3 znaków)
  • End sentinel - jeden znak (ogólnie "?")
  • Wzdłużna kontrola redundancji (LRC) - jest to jeden znak i znak ważności obliczony na podstawie innych danych na ścieżce. Należy zauważyć, że większość urządzeń czytnika nie zwraca tej wartości, gdy karta jest przeciągnięta do warstwy prezentacji, i używa jej tylko do weryfikacji wejścia wewnętrznie do czytnika.

Utwór 2: Ten format został opracowany przez przemysł bankowy (ABA). Ścieżka jest zapisana za pomocą 5-bitowego schematu (4 bity danych + 1 parzystość), co pozwala na szesnaście możliwych znaków, które są cyframi 0-9 plus sześć znaków:; < =>? . Wybór sześciu znaków interpunkcyjnych może wydawać się dziwny, ale w rzeczywistości szesnaście kodów po prostu odwzorowuje zakres ASCII od 0x30 do 0x3f, który definiuje dziesięciocyfrowe znaki plus te sześć symboli. Format danych jest następujący:

  • start sentinel - jeden znak (zazwyczaj ';')
  • numer konta
  • Primary (PAN) - maksymalnie 19 znaków. Zazwyczaj, ale nie zawsze, odpowiada numerowi karty kredytowej wydrukowanemu na przedniej stronie karty.
  • Separator - jeden znak (zazwyczaj "=")
  • Data wygaśnięcia - cztery znaki w formularzu RRMM. Kod
  • Service - trzy znaki
  • luksusowe danych - podobnie jak w torze jeden
  • Koniec Sentinel - jedna postać (ogólnie „?')
  • Wzdłużna kontrola nadmiarowa (LRC) - jest to jeden znak i znak ważności obliczony na podstawie innych danych na ścieżce. Należy zauważyć, że większość urządzeń czytnika nie zwraca tej wartości, gdy karta jest przeciągnięta do warstwy prezentacji, i używa jej tylko do weryfikacji wejścia wewnętrznie do czytnika.
+0

Czy możesz podać przykłady takich danych? –

+0

Jestem w biznesie cc od dłuższego czasu i trudno mi sobie wyobrazić, dlaczego tego potrzebujesz. Zasadniczo, ponieważ utwór 1,2,3 znajduje się w domenie wydawcy, często trudno jest znaleźć dane inne niż PAN, data wygaśnięcia i kod usługi na ścieżce, a dane o nazwach również mogą być śmieciami, ja nawet przyjechałem przez PAN, które nie przechodzą kontroli Luhna.Dlatego wydaje mi się, że będziesz miał sporo specjalnych przypadków w produkcji, aby precyzyjnie dostroić wyrażenie regularne tak, aby nie odrzucać wykonalnych danych produkcyjnych, które kolidują ze specyfikacją iso. – bbozo

Odpowiedz

2

miałem pisać ten sam link na regular-expressions.info, do weryfikacji numer części cc toru.

Nadchodzi trudna część. Dane śledzenia różnią się formatem między wydawcami kart, a nawet czytnikami kart. Na przykład znaki "separatora" nie zawsze są takie same. To samo dotyczy końca "wartowników".

Wikipedia daje dobry przegląd: http://en.wikipedia.org/wiki/Magnetic_stripe_card

Z Track2, numer karty następuje po nim '=' (lub czasami 'D'). Następnie masz datę wygaśnięcia jako MMDD. Następnie Track2 ma "dane uznaniowe", które mogą być dowolne.

Nie martwiłbym się zbytnio po tym punkcie. Jeśli są to dane o utworze, będziesz już prawie pewien. Sądzę, że to zależy od tego, co zamierzasz zrobić z danymi.

Zresztą dla Track2 można zrobić o wiele gorzej niż dodawanie [= D] [0-9] {4} zamiast $ na koniec regex 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} 

Dla Track1, możesz zrobić coś podobnego ... Track1 zawiera więcej zmiennych danych, więc może być bardziej skomplikowany.

Powodzenia!

1

Track 1, Format B przekłada się

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

z pewnych założeń co do tego, co stanowi ważny znak.

Oczywiście nie ma sprawdzeń, czy dane są rzeczywiście znaczące, a LRC (jeśli jest obecny) również nie może zostać zatwierdzony.

Czy możesz to sprawdzić w oparciu o prawdziwe dane i sprawdzić, czy to działa?

Track 2 przekłada się

;[^=]{0,19}=\d{4}\w{3}[^?]+\?\w? 
+0

Przetestowałem je na danych z naszego czytnika kart, ale nie działały. – NYSystemsAnalyst

+0

Wygląda na to, że pole "dane uznaniowe" zezwala na wszystkie alternatywy, a nie tylko jedną z nich. Zmieniono wyrażenia regularne. Teraz powinny działać. –

2

Następujące dwa wyrażenia regularne wydają się potwierdzać ścieżkę 1 i śledzić 2 dane. Zwróć uwagę, że te wyrażenia regularne przyjmują założenia, że ​​używane znaki są tymi, które są "ogólnie" używane w powyższej informacji z Wikipedii.

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

Zakłada, że% i? są znakami wskaźnikowymi, a znak^jest używany jako znak separatora pola. Zakłada się również, że numer konta, data i kod usługi są cyframi.

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

Przyjmuje, że; i ? są znakami wartownika, a znak = jest znakiem separatora pola. Zakłada się również, że numer konta, data i kod usługi są cyframi.

Przetestowałem te wyrażenia, używając danych ścieżek odczytanych z czytnika kart MagTek.Dwa kolejne zestawy meczu danych toru, co zostało odczytane z czytnika i zatwierdzić wobec dwóch wyrażeń regularnych powyżej (numery które oczywiście zostały zmienione):

%B1234567891234567^SMITH/JOHN    ^15024041234567891234? 
;1234567891234567=152024041234567891234? 
8

Oto REGEX że pracuje dla mnie, aby wybrać zarówno Tor 1 i Track 2. Użyj tego z opcją wyodrębnienia "Kropka NIE pasuje do nowej linii".

^%(?<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 

testowałem z tymi danymi (mój czytelnik czyta zarówno Track 1 i Track 2 rekord, w tej kolejności, na tej samej karcie I badanego z -. Numerów i zmieniono nazwę poniżej)

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

powyższy REGEX zastosowania wymienionych grupach CAPTURE ("?" THE który rozpoczyna się każdy (grupa)) i widzę wynik (z RegexBuddy) jako:

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 

Uwaga drugi mecz nie identyfikuje FC (format kod) d NM (nazwa) w ścieżce 2 (mecz 2), ponieważ nie są one używane na ścieżce 2.

Jeśli twój silnik wyrażeń regularnych nie obsługuje GRUP NAMED, po prostu zabij "?" część każdej z grup przechwytujących. Następnie użyj pozycji, aby określić każdą grupę.

Ponadto, mój pojedynczy PRZESYŁEK zawiera ZARÓWNO ścieżkę 1 i ścieżkę 2 (w tej kolejności, ścieżkę 1, a crlf, a następnie ścieżkę 2). Zgodnie z linkiem do Wikipedii w pytaniu oryginalnym, karty mogą zawierać do 3 ścieżek, a czytelnicy mogą czytać ścieżki 1 i 2 zarówno (lub jeden), jak i rzadko śledzić 3.

Z tego powodu uważam, że jest to Bezpieczny zakład, aby użyć REGEX, który wyszukuje zarówno ścieżkę 1, jak i ścieżkę 2, a jeśli otrzymasz obie, możesz zignorować ścieżkę 2 (ponieważ ścieżka 1 ma więcej danych) lub cokolwiek chcesz.

Ponieważ oba ślady są obecne w moich przeciągnięciach, silnik REGEX zwróci 2 mecze z moim REGEX powyżej (przy założeniu braku błędu odczytu z czytnika i czytnika obsługującego obie ścieżki). W moim przypadku nie przeszkadza mi to i po prostu planuję użyć "pierwszego meczu" i zignorować drugi.

Jeśli jesteś zainteresowany tylko w ścieżce 1, należy użyć tego wyrażenia regularnego:

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

Jeśli jesteś zainteresowany tylko w torze 2, należy użyć wyrażenia regularnego:

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

Ale nie widzę szkoda w sprawdzeniu obu, a następnie skorzystaniu z pierwszego otrzymanego, lub może porównanie ścieżki 1 do ścieżki 2 jako dodatkowego kroku sprawdzania błędów.

Przepraszamy za odpowiedź, na którą wydaje się być odpowiedzią!

+0

Pozostałe odpowiedzi nie działają na kartach podarunkowych, dziękuję! – Dustin

+0

Twój track2 nie działa na kartach podarunkowych. – Dustin

+0

Patrząc na tę kwestię więcej, wydaje się, że niektóre karty podarunkowe mają 0 znaków, mimo że Wikipedia podaje od 2 do 26 znaków. – Dustin

0

Uwaga: Numer konta na ścieżce1 może zawierać spacje dla kart American Express. A więc:

^%(?.)(?[\d\s]{1,19}+)\^(?.{2,26})\^(?[\d]{0,4}|\^)(?[\d]{0,3}|\^)(?.*)\?|;(?[\d]{1,19}+)=(?[\d]{0,4}|=)(?[\d]{0,3}|=)(?.*)\?\Z