chipTAN Flickercodes ==================== „chipTAN“ ist ein Verfahren, das Online-Banking unanfälliger gegen zum Beispiel Man-In-The-Middle-Angriffe machen soll. Dabei bekommt jeder Bankkunde ein Gerät, das zusammen mit seiner Kreditkarte auftragsgebundene TANs generieren kann. Vor der Generierung einer TAN werden Zielkontonummer und Betrag (je nach Überweisungstyp auch andere Werte, wie IBAN oder Anzahl) angezeigt und können vom Kunden verifiziert werden. Diese Daten können manuell eingegeben werden oder (darum soll es im Folgenden gehen) über eine optische Schnittstelle übertragen werden. Diese optische Schnittstelle ist in der HHD-Spezifikation (Version 1.3) des ZKA__ beschrieben. Das Problem dabei: Die Spezifikation ist nur teilweise öffentlich zugänglich. Es bleibt also nur der Weg über reverse engineering. __ http://www.hbci-zka.de/ Aufbau ------ Im Folgenden werde ich den Aufbau der sogenannten „Flickercodes“ an dem Beispielcode ``11048714955205123456789F14302C303107`` erläutern. Diese Flickercodes sind die Daten, die auch an den externen TAN-Generator weitergegeben werden. ========== ================================================================ Code Bedeutung ========== ================================================================ 11 Länge des Codes 0 Flag: BCD-kodiert 4 4 Bytes lang 871 Maske: 8 = Freie Gestaltung, 7 = Kontonummer, 1 = Betrag, siehe Masken_ 49552 Zufallszahl oder Transaktionsnummer 0 Flag: BCD-kodiert 5 5 Bytes 123456789F Kontonummer, BCD-kodiert, Füllzeichen ``F`` am Ende 1 Flag: ASCII-kodiert 4 4 Bytes 302C3031 ASCII-String: 0,01 0 Luhn-Prüfsumme 7 XOR-Prüfsumme ========== ================================================================ Wie man gut erkennen kann, ist jeder Code in mehrere Bereiche unterteilt, die jeweils mit einem Kodierungsflag (BCD = 0 oder ASCII = 1) und einer Länge (``0``–``F``) beginnen und dann einen (in der Theorie) maximal 16 Byte langen Payload enthalten. Prüfsummen ++++++++++ Die einzelnen Stellen (Halbbytes) werden hier mit x\ :sub:`1` bis x\ :sub:`n` bezeichnet, wobei n die Länge des Flickercodes ist. p\ :sub:`1` bis p\ :sub:`m` ist der Payload ohne Längen- oder Kodierungshalbbytes. Der Payload des obigen Beispiels ist ``871 49552 123456789F 302C3031`` (ohne Leerzeichen). Die Luhn-Prüfsumme wird nur über den Payload berechnet: :eqn:`(10 - ((p_1 + q(2 p_2) + p_3 + q(2 p_4) + \\ldots) \\bmod 10)) \\bmod 10`. q(n) berechnet die Quersumme der Dezimalzahl n, die Eingabezeichen ``A``–``F`` werden als Hexadezimalzahlen interpretiert und erhalten damit die Wertigkeit 10–16. Die XOR-Prüfsumme wird über alle Zeichen, bis auf die Prüfsumme selbst, berechnet: :eqn:`x_1 \\oplus x_2 \\oplus \\ldots \\oplus x_{n-2}` Masken ++++++ Im ersten Datenbereich wird unter anderem festgelegt, wie sich das Gerät des Benutzers verhalten soll. Es gibt die, auch im obigen Beispiel benutzte, frei belegbare Maske ``8xy``, mit ``x`` und ``y`` aus dieser Tabelle: ====== ================== ============ Nummer Transaktionsdaten Displaytext ====== ================== ============ 1 Betrag Betrag 2 Kontonummer Konto/IBAN 3 Online-Banking-PIN OBanking-PIN 4 Telefonnummer Telefon 5 Bankdaten Zusatzdaten 6 Anzahl Anzahl 7 Kontonummer Kontonummer 8 Kontonummer IBAN ====== ================== ============ Es existieren weitere Masken, die in den Belegungsrichtlinien (siehe Literatur_) beschrieben sind. Optische Schnittstelle ---------------------- .. figure:: ../../media/00/20/flicker.png :align: right Belegung der blinkenden Grafik Auf der Rückseite des Geräts befinden sich fünf Fotosensoren, die zur Übertragung über eine blinkende Grafik gehalten werden müssen. Es werden jeweils vier Bits und ein Taktsignal übertragen. Die blinkenden Bereiche sind wie folgt belegt: Takt, Bit 2\ :sup:`0`, Bit 2\ :sup:`1`, Bit 2\ :sup:`2`, Bit 2\ :sup:`3`. Der oben beschriebene Flickercode wird mit dem vorangestellten Code ``0FFF`` in einer Endlosschleife übertragen. Die Übertragungsreihenfolge der einzelnen Halbbytes wird dabei umgekehrt. Beispiel: Aus ``11048714955205123456789F14302C303107`` wird zur Übertragung ``F0 FF 11 40 78 41 59`` … Um einfacher verschiedene Belegungen ausprobieren zu können, habe ich einen `Flickercode-Generator`__ mit JavaScript und dem HTML-``canvas``-Element implementiert, der die Prüfsummen automatisch berechnet und einsetzt. __ media:flickercode.html Literatur --------- - `TAN-Generatoren mit optischer Schnittstelle (Flickercode)`__ (Votragsfolien vom 26C3, PDF) - `Belegungsrichtlinien für die Dynamisierung der TAN`__ (PDF) - `Konfigurationscodes für Kobil TAN Optimus comfort`__ __ http://bitinfarkt.de/chiptan/26C3_chiptan_slides.pdf __ http://www.hbci-zka.de/dokumente/spezifikation_deutsch/Belegungsrichtlinien%20TAN-Generator%20ve1.3%20final%20version.pdf __ ../../media/00/20/kobil_configcodes.txt