Site Overlay

iTAN Listen mit Hilfe von OCR einlesen

Quelle: CC BY-SA 3.0

Obgleich die iTAN als Auslaufmodell gilt, schicken viele Finanzinstitute ihren Kunden weiterhin solche Listen als “fall back”, wenn moderne Verfahren scheitern. Meine Hausbank versendet solche Listen in einem Format, das in 6 Spalten mit jeweils 20 Zeilen insgesamt 120 numerierte TANs enthält. Wer diese iTANs in einen anerkannten Passwort-Manager wie z.B. KeePassX übertragen möchte, dem steht jede Menge Abtipp-Arbeit bevor. Wer jedoch ein wenig Ehrgeiz an den Tag legt, dem gelingt das automatisierte Einlesen per OCR erstaunlich gut.

[alert type=”warning” icon-size=”normal”]Einge Finanzinstitute untersagen die Übertragung der iTANs in Passwort-Manager selbst dann, wenn diese Manager die Daten mit anerkannten Verfahren verschlüsseln und getrennt von der Telebanking-PIN abgespeichern. Vor Anwendung dieser Methode sollte jeder Nutzer die AGBs seiner Bank genau studieren.[/alert]

1. Grafische Bedienoberflächen vs. Konsole

Ich habe jede Menge grafische Bedienoberflächen durchprobiert – Ergebnis: Alle Resultate waren bislang unzureichend. Nachdem ich das leidige OCR-Thema lange Zeit ruhen gelassen habe, bin ich durch Zufall auf eine Anleitung gestoßen, bei der ausschließlich mit Konsolenbefehlen gearbeitet wird, die sich sogar zu einem Script zusammenfassen lassen, das es erlaubt, eine iTAN Liste innerhalb weniger Sekunden zu scannen und als ASCII Text auszugeben.

Erforderlich sind dazu im wesentlichen die Programmpakete Tesseract und Imagemagick, die sich problemlos unter Ubuntu installieren lassen.

2. Kochrezept zur Umwandlung der iTAN-Liste in eine Scan-Vorlage

2.1 Scannen der Liste

Es empfiehlt sich die Liste mittels des scanimage Kommandos im Grauformat mit einer Auflösung von mindestens 300 dpi zu erfassen und im pnm-Format (portable network map) abzuspeichern.

Gleichzeitig kann der gesamte Scanbereich bereits durch die Parameter t, l, x und y eingegrenzt werden, so dass keine unnötigen Leerflächen und Spaltenbeschriftungen erfasst werden. Dieses Kommando sieht bei mir wie folgt aus:

Zur exakt waagerechten Ausrichtung der Zeilen wird häufig noch empfohlen, das gescannte Bild mit dem unpaper Befehl entsprechend auszurichten. Da die Scanvorlage jedoch ohnehin schon präzise auf dem Scannerglas liegt, ist dieser Schritt m.E. im konkreten Anwendungsfall entbehrlich. Ebenfalls nicht erforderlich ist es, das Bild mittels des convert Befehls aus dem imagemagick Paket in ein Graustufenbild umzuwandeln – der scanimage Befehl hat dies ja bereits durch den Parameter --mode 'Gray' bewirkt.

2.2 Vergrößern

Die zuvor erwähnte Anleitung von howtoforge.com weist darauf hin, dass sich die Treffsicherheit der Tesseract OCR Software erheblich erhöht, wenn man zuvor das gesacnnte Bild vergrößert:

Resizing is one of the most helpful tricks to improve OCR accuracy. This is because most of time images, have very small font size which cannot be read properly by Tesseract.

Dies lässt sich durch den convert Befehl des Imagemagick-Paketes erreichen. Gleichzeitig verwandeln wir das gescannte Bild in ein png-Format.

2.3 Umwandlung in ein binäres (schwarz-weiß) Bild

Oftmals erfolgt bereits in den vorherigen Schritten die Empfehlung, das Bild gleich als TIF-Format abzuspeichern, so dass eine reine schwarz-weiß-Vorlage entsteht, die Tesseract besser verarbeiten kann. Dies würde jedoch zu unerwünschten Resultaten führen, da sich bei der TIF-Erzeugung kein individueller Schwellwert eingeben lässt, ab wann ein Bildpunkt als Schwarz oder weiß gelten soll. Während die Lesbarkeit der Liste für einen Menschen erhöht wird, wenn jede 2. Zeile mit einem grauen Hintergrund hinterlegt ist, verhält es sich bei der TIF-Erzeugung genau umgekehrt: Die Buchstaben verschwimmen mit dem grauen Hintergrund.

Der convert Befehl erlaubt es, mit Hilfe eines sinnvoll gewählten Schwellwertes (in meinem Fall 30%) den grauen Hintergrund in jeder 2. Zeile der Liste fast vollständig herauszufiltern.

2.4 Ausschneiden der Spalten mit den iTANs

Neben der grauen Hinterlegung von Zeilen oder Spalten, kann die iTAN Liste noch weitere Elemente enthalten, die sich für die maschinelle Texterkennung als hinderlich erweisen. Dazu gehören in meinem Fall vertikale Linien, die die einzelnen Spalten trennen.

Ich schneide daher aus der iTAN-Liste die 6 Spalten mit den nackten iTANs (ohne irgendwelche Trennlinien und auch ohne die vorangehende Numerierung) aus. Die Numerierung wird später mit Hilfe des awk-Kommandos hinzugefügt.

Mit Hilfe des convert befehls lassen sich per --crop die einzelnen Spalten ausschneiden. In meinem Fall sind sie 300 pixel breit, 1285 pixel hoch. Die erste Spalte mit iTANS beginnt mit 191 pixel Abstand vom linken Rand, alle folgenden jeweils noch 497 pixel weiter rechts.

2.5 Texterkennung auf Zahlen beschränken

Lässt man Tesseract ohne weitere Beschränkungen auf die zuvor ausgeschnittenen iTAN Spalten los, so wird das Ergebnis immer noch unbefriedigend sein. Dies liegt im wesentlichen daran, dass der OCR Software ein Hinweis fehlt, dass sie ausschließlich nach Ziffern und nicht etwa nach Buchstaben suchen soll.

Durch die Parameter nobatch digits kann man Tesseract mitteilen, dass die Textvorlage ausschließlich aus Ziffern besteht. Dadurch werden jede Menge Zweideutigkeiten – etwa dass irrtümlich eine 6 als b, eine 1 als I oder eine 5 als S erkannt werden – aufgelöst. Den Parameter zur Beschränkung von Tesseract auf Zahlen habe ich auf Stackoverflow gefunden.

2.6 Falsch erkannte Leerzeilen entfernen

Der awk-Befehl in der for-Schleife, die durch die einzelnen Spalten der iTAN Liste geht, entfernt schließlich fehlerhaft eingefügte Leerzeilen aus dem ASCII-Text, so dass in der Reihenfolge der Orginalnumerierung der iTANs in jeder Zeile der ASCII-Ausgabe exakt die eine entsprechende iTAN-Nummer steht.

2.7 Zeilennumerierung hinzufügen

Nachdem die Datei list.txt 120 Zeilen mit jeweils einer iTAN in der ursprünglichen Reihenfolge der Numerierung auf dem Papier-Original enthält, fügen wir diese Nummern zur besseren Lesbarkeit wieder hinzu. Dies geschieht – nach Abschluss der for-Schleife mit einem weiteren awk-Kommando:

Die 120 iTANs werden Zeile für Zeile mit der entsprechenden Nummer davor auf der Konsole ausgegeben und können von dort als Klartext in den entsprechenden Passwort-Manager eingefügt werden.

3. Zusammenfassung als Skript

Sämtliche Schritte des Abschnitts 2 können zu einem ausführbaren Skript zusammengefasst werden, das es erlaubt, eine komplette iTAN Liste direkt vom Scanner in eine Textausgabe umzuwandeln. Zur vereinfachung wird hier noch ein Arbeitsverzeichnis in der volatilen Ramdisk festgelegt, was den Vorteil hat, dass spätestens nach einem Reboot keinerlei unverschlüsselte Datenreste auf dem Rechner verbleiben.

4. iTAN Listen der ING Diba

Die ING verschickt TAN Listen mit 196 Einträgen, die auf zwei Seiten mit jeweils 98 iTANs (001-098 und 099-198) gedruckt sind. Jede Seite enthält 6 Spalten. Da die Struktur der Seiten nicht 100% identisch ist, empfiehlt es sich jede Seite einzeln einzulesen. Außerdem müssen die Parameter jeweils leicht angepasst werden.

4.1 Erste Seite (iTAN 001-098)

Scannen und Vorbehandlung

Zuschneiden und Texterkennung

4.2 Zweite Seite (iTAN 099-198)

Scannen und Vorbehandlung

Zuschneiden und Texterkennung

ggg