Indtil for nylig var det lige så nemt at læse kreditkortdata som at trække et kort gennem en læser (f.eks. en af de mange læsere fra ID TECH) og få en virtuel terminal-app (eller andre apps) til at opsuge sporoplysningerne, når de kommer direkte ud af læseren. De pågældende data ville simpelthen blive vist som tastetryk på en skærm, ukrypteret.
Det var dengang!
Det skal siges, at tingene har ændret sig. I dag udsender magnetstribe-læsere generelt krypterede data via USB (ofte i HID-tilstand i stedet for tastaturtilstand), og de fleste kortlæsere skal i dag håndtere chipkort ud over magnetstribe-kort. Chipkortdata har form af TLV’er (tags, length, values) og kan se helt anderledes ud end tidligere tiders “almindelige gamle magnetkortdata”. Desuden er de uvægerligt krypterede.
I de seneste indlæg viste jeg, hvordan man dekrypterer kreditkortdata ved hjælp af branchestandard TDES- og AES-dekrypteringsalgoritmer i forbindelse med branchestandard (ANSI X9.24) DUKPT-nøgleafledningsteknikker, men vi talte ikke om, hvordan man overhovedet får dekodede magnetstripedata. Hvordan ser “magstripe-kreditkortdata” ud nu? Hvordan kan man få fat i dem og afkode dem? Hvordan ved man, hvilke dele der er krypteret?
Svaret på det første spørgsmål (hvordan ser magstripe-data ud?) varierer meget, ikke kun afhængigt af mærket og modellen af det kortlæsningsudstyr, man bruger, men også afhængigt af, om den pågældende transaktion blev foretaget via mag swipe, dip (kontakt EMV) eller kontaktløs/NFC-interaktion. Generelt set gør du meget mere end blot at læse rå trackdata. Du indhenter også et KSN (Key Serial Number), som er nødvendigt for dekryptering, og du høster forskellige former for metadata vedrørende transaktionen. Det er rigtigt, at du måske kun er interesseret i at få fat i (lad os sige) rå Track 2-data, men i processen med at få fat i dem, skal du også håndtere mange andre data.
Lad os tage et hurtigt kig på et eksempel fra den virkelige verden, hvor vi bruger et Starbucks-gavekort, som jeg fik af en barista med dårlig samvittighed, som en make-good, efter at jeg uventet løb tør for Mesopotamian Kumquat-Absinthe Latte. Hvis vi trækker Starbucks-kortet gennem ID TECH’s Augusta-kortlæser i tastaturtilstand med Notepad-vinduet åbent (og markøren i tekstvinduet), får vi følgende data i Notepad:
02ED01801F4C2800839B%*6010********8765^0254/SERVICERECOVERYUSD^*******************************?*;6010********8765=********************?*95025C86987E4F7DD07D58730EB79FDFB90AB7F23E6ECA6F4F04A67BF511EE13F950903BDE77624680C460E9C36C4F9136256BB93A38CB98F95626DCFAF9335CE0A213074CC1CD84CC911398E06756C464AB036B694228ADA7EC018F495A013AF8A04C976288FE2F80271E6E53D987DE19ACA2707BFF2C78000000000000000000000000000000000000000000000000000000000000000000000000000000003631335435333536313862994900750002A00308108E03
Dette er meget mere end “rå trackdata”. Du kan genkende de maskerede spordata (som begynder med B% og indeholder mange stjerner, der til sidst ender med ?*), men det skjuler det primære kontonummer (Primary Account Number (PAN)), som faktisk er krypteret. Det meste af det, du ser her, er en hexadecimal repræsentation af de binære data, der kommer ud af læseren.
Det er nemt at fortolke denne store blok af ting, hvis du har know-how. Den hurtigste måde at afkode det på er at køre dataene gennem ID TECHs gratis Parsomatic-værktøj, som er en HTML-formular, der kan gengive alle datastykkerne på en forståelig måde.
Hver kortlæser har sin egen proprietære måde at repræsentere kortdata på. ID TECH repræsenterer magstripe-data i et format, der er kendt som Enhanced Encrypted MSR-format. Formatet omfatter 26 datafelter; alle 26 felter er beskrevet i detaljer i dokument P/N 80000502-001, ID TECH Encrypted Data Output.
For at give dig en idé om, hvad der er på kortet, skal vi se på de første 5 bytes af data (02 ED 01 80 80 1F). Ifølge Parsomatic indeholder disse 5 bytes følgende oplysninger:
STX | 02 |
LENGTH | ED 01 |
Card Encode Type | 80 |
Sporstatus (1F) |
0------- 0 Reserved for future use-0------ 1: Field 10 optional bytes length exists (0: No Field 10)--0----- 1: Track 3 sampling data exists (0: Track 3 sampling data does not exist)---1---- 1: Track 2 sampling data exists (0: Track 2 sampling data does not exist)----1--- 1: Track 1 sampling data exists (0: Track 1 sampling data does not exist)-----1-- 1: Track 3 decode success (0: Track 3 decode fail)------1- 1: Track 2 decode success (0: Track 2 decode fail)-------1 1: Track 1 decode success (0: Track 1 decode fail) |
Den første byte (02) er simpelthen STX, “start”-byte. De næste to bytes (ED 01) repræsenterer længden i hexadecimaler af den samlede data payload (little-endian: ED 01 betyder faktisk 0x01ED eller 493 bytes data). Card Encode-typen er 0x80, hvilket (på engelsk) betyder, at vores læser mener, at der er tale om et betalingskort. Track Status (værdi: 0x1F) er en statusbyte, der indeholder otte-bit flag, så du ved, hvilke spor der var til stede på magnetstriben (der kan være op til 3), og hvilke der blev læst med succes. I dette tilfælde blev alle 3 fysiske spor læst med succes, men der findes kun data på spor 1 og 2.
Lad os hurtigt se på de næste 5 bytes. I henhold til Parsomatic er disse bytes og deres betydninger som følger
Spor 1 Længde | 4C |
Spor 2 Længde | 28 |
Spor 3 Længde | 00 |
Spor 3 Længde | 00 |
Status for afsendte data (83) |
1------- Bit 7: 1 Serial Number present; 0 not present-0------ Bit 6: 1 PIN Encryption Key; 0 Data Encryption Key--0----- Bit 5: 1 Chip present on card. (First byte of service code was '2' or '6'.) Use EMV transaction if possible.---0---- Bit 4: 0 TDES; 1 AES----0--- Bit 3: 1 if fixed key; 0 DUKPT Key Management-----0-- Bit 2: 1 if Track3 clear/mask data present------1- Bit 1: 1 if Track2 clear/mask data present-------1 Bit 0: 1 if Track1 clear/mask data present |
Status for afsendte krypterede/hash-data (9B) |
1------- Bit 7: if 1, KSN present-0------ Bit 6: if 1, session ID present --0----- Bit 5: if 1, track3 hash data (SHA digest) present---1---- Bit 4: if 1, track2 hash data (SHA digest) present----1--- Bit 3: if 1, track1 hash data (SHA digest) present-----0-- Bit 2: if 1, track3 encrypted data present------1- Bit 1: if 1, track2 encrypted data present-------1 Bit 0: if 1, track1 encrypted data present |
På et betalingskort, kan spor 1 være op til 79 bytes langt; Spor 2 kan være op til 40 bytes langt, og Spor 3 kan være op til 107 bytes langt. I dette tilfælde har vi 76 bytes (hex 0x4C) data til spor 1 og 40 bytes (0x28) data til spor 2. (Spor 3 havde nul bytes.) Disse længder er vigtige at kende, ikke kun for at analysere de maskerede spordata, men også for at bestemme længderne af de krypterede versioner af sporene. Den krypterede længde er forskellig fra den faktiske oprindelige sporlængde, fordi spildata skal polstres til en slutlængde, der er et multiplum af 8 for TDES-kryptering eller et multiplum af 16 for AES.
Hvordan ved vi, om dataene er TDES-krypterede kontra AES-krypterede? Den oplysning findes i bit 4 i Clear/Mask Data Sent Status-byte (som vist ovenfor). Der er også en Encrypted/Hash Data Sent-statusbyte (vist ovenfor) for at fortælle, om der er krypterede spordata (og valideringshashes) til stede, og om der findes en KSN.
Nu kommer vi til spor 1- og spor 2-maskerede data, efterfulgt af de krypterede versioner af disse, efterfulgt af nogle hash-data (i dette tilfælde alle nuller) og nogle andre data (beskrevet nedenfor). Bemærk, at Parsomatic har konverteret ASCII-spordataene til en hex-repræsentation nedenfor:
Spor1 Data | 25 2A 36 30 31 30 30 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 38 37 36 35 5E 30 32 35 34 2F 53 45 52 56 49 43 45 52 45 43 4F 56 45 52 59 55 53 53 44 5E 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 3F 2A |
Track2 Data | 3B 36 30 30 31 30 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 38 37 36 36 35 3D 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 3F 2A |
Spor1 Krypterede data | 95 02 5C 86 98 7E 4F 7D D0 7D 58 73 0E B7 9F DF B9 0A B7 F2 3E 6E 6E CA 6F 4F 04 A6 7B F5 11 EE 13 F9 50 90 3B DE 77 62 46 80 C4 60 E9 C3 6C 4F 91 36 36 25 6B B9 3A 38 CB 98 F9 56 26 DC FA F9 33 5C E0 A2 13 07 4C C1 CD 84 CC 91 13 98 E0 67 56 C4 Dekrypter disse data |
Track2 Krypterede data | 64 AB 03 6B 69 42 28 AD A7 EC 01 8F 49 5A 01 3A F8 A0 4C 97 62 88 FE 2F 80 27 1E 6E 53 D9 87 DE 19 AC A2 70 7B FF 2C 78 Dekrypterer disse data |
Spor 1 Hashed | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 |
Spor 2 Hashed | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
Reader Serial Number | 36 31 33 54 35 33 33 35 36 36 31 38 |
KSN | 62 99 49 00 75 00 02 A0 03 08 |
LRC | 10 |
Checksum | 8E |
ETX | 03 |
Bemærk, at Parsomatic indsætter et “Dekrypter disse data”-link ved siden af krypterede data (se ovenfor). Hvis du klikker på linket, fører det dig til ID TECHs Encrypt/Decrypt Tool, hvor de pågældende data kan ses i dekrypteret form.
De sidste datafelter omfatter Læserens serienummer, Key Serial Number (KSN), et LRC, en kontrolsum og ETX (end of transmission). LRC er ganske enkelt en byteværdi, der repræsenterer XOR (eksklusiv OR) af alle payload data-bytes, mens checksummen er en aritmetisk sum på én byte (naturligvis uden overløb) af alle bytes i payload. LRC og checksummen kan bruges til at kontrollere integriteten af dataene i nyttelasten. (De er noget nemmere og hurtigere at beregne end en rigtig CRC.)
Slutning
Så som du kan se, er der meget mere i en magstripe-data end “track data”. Vi har ikke engang berørt betydningen af nogle af datafelterne (måske kan vi komme ind på det i et fremtidigt indlæg). Vi har heller ikke sagt noget om EMV-data (hvilket helt sikkert vil kræve et andet indlæg). Men dette skulle kunne hjælpe dig i gang, hvis du forsøger at afkode data, der kommer ud af en ID TECH-kreditkortlæser.
For yderligere oplysninger skal du (som jeg sagde tidligere) sørge for at konsultere vores tekniske dokumentation om Enhanced Encrypted MSR-dataformatet: ID TECH Encrypted Data Output. ELLER klik på linket nedenfor for at tage det første skridt mod strømlinede betalinger!