Das Bild in diesem Blog-Beitrag stammt von Steve Buissinne auf Pixabay

2013 haben wir den Cache Seattle-Köln Exchange Multicache, bei dem Geocacher aus Köln und Seattle zusammen arbeiten müssen, gesucht und gefunden. Das brachte mich auf die Idee, einen Geocache zu entwerfen, bei dem zwei Personen an weit entfernten Orten genau zur gleichen Zeit einen Knopf drücken müssen, um ihre jeweilige Cache-Box öffnen zu können. Und jetzt habe ich diese Idee endlich in die Realität umgesetzt.

Herausforderungen

Die Realisierung der Idee bringt eine Reihe von Herausforderungen mit sich, sowohl auf konzeptioneller als auch auf Software- und Hardware-Ebene. Wie kann man sicherstellen, dass die beiden Geocacher den Knopf zur gleichen Zeit gedrückt haben?

Da die Geocaches einige hundert Kilometer voneinander entfernt liegen sollen (z.B. Freiburg und Osnabrück), ist eine drahtlose Verbindung zwischen den Cache-Boxen keine Option. Die einzige Möglichkeit ist, sich auf genaue Uhren zu verlassen, was an sich schon eine Herausforderung darstellt.

Aber selbst wenn man von genauen Uhren ausgeht, wie kann man sicherstellen, dass beide Parteien den Knopf zur gleichen Zeit gedrückt haben? Die Idee ist, kryptografische Methoden zu verwenden, die denen ähneln, die von Authentifizierungs-Apps mit zeitbasierter Generierung von Passcodes verwendet werden.

Schließlich muss sichergestellt werden, dass sich die Cache-Box nur öffnet, wenn die richtigen Zahlen eingegeben werden. Wenn man eine solche Box nicht von Grund auf neu entwerfen will, muss man eine bereits vorhandene modifizieren.

All das hat mich eine ganze Weile beschäftigt.

Genaue Uhren

Wie viel Genauigkeit braucht man für einen solchen Cache? Wenn man Uhren haben will, die über die Lebensdauer von, sagen wir, zehn Jahren nicht mehr als 1 Sekunde voneinander abweichen, dann muss man großen Aufwand betreiben. Eine Atomuhr würde ausreichen, aber die meisten davon sind zu klobig, um in eine Cache-Box zu passen. Heutzutage gibt es Atomuhren auf Rubidium-Basis in Chipgröße, z. B. die ICPT-1, mit der man eine Genauigkeit von 10-15 erreichen kann, d. h. weniger als eine Abweichung von 2 µs in 10 Jahren. Leider kostet sie mehr als 3000 € und benötigt etwa 500 mA bei 3,3 Volt, was für ein batteriebetriebenes Gerät zu viel ist.

Eine viel billigere Alternative ist entweder das GPS-Zeitsignal, das auf Atomuhren basiert, oder das DCF77-Funksignal in Deutschland, das die offizielle deutsche Zeit überträgt, ebenfalls auf der Grundlage einer Atomuhr. In anderen Gebieten gibt es ähnliche Zeitzeichensender. Das Hauptproblem besteht darin, dass man, wenn man keine Kontrolle darüber hat, wie die Empfänger und insbesondere die Antennen platziert sind, nicht garantieren kann, dass das jeweilige Signal auch tatsächlich empfangen wird, was diese Möglichkeiten ausschließt.

Die vernünftigste Alternative ist dann die Suche nach hochgenauen Echtzeituhren (RTC). Eine solche RTC ist die DS3231SN von Maxim, die einen temperaturgesteuerten Quarz (TCXO) auf dem Chip enthält. Sie hat eine Genauigkeit von 2 ppm im Temperaturbereich von 0 °C bis +40 °C, d.h. etwa 1 Minute Abweichung pro Jahr, und eine Genauigkeit von 3,5 ppm im Temperaturbereich von -40 °C bis +85 °C, d. h. weniger als 2 Minuten Abweichung pro Jahr. Pete hat mit diesen Chips ausgiebig experimentiert und ist zu dem Schluss gekommen, dass die RTC oft viel besser funktioniert als in der Spezifikation angegeben. Meine eigenen Erfahrungen sind ähnlich. In dem Satz DS3231-Breakout-Boards, den ich besitze, fand ich ein Paar Chronodot V2.0-Klone (man beachte den Schreibfehler auf der Platine im Bild), die ein perfektes Paar waren. Es stellte sich heraus, dass sie nach einem Monat nur um 10 ms pro Tag von der wahren Zeit abwichen, d. h. weniger als 4 Sekunden pro Jahr (bei Raumtemperatur). Allerdings gab es auch einige schwarze Schafe, die außerhalb der Spezifikation lagen.

Nachweis der Synchronität

Wenn man die genaue Zeit kennt, wie kann man dann sicherstellen, dass zwei Personen an verschiedenen Orten (fast) zur gleichen Zeit einen Knopf gedrückt haben? Wenn man davon ausgeht, dass die beiden Personen über ein Mobiltelefon miteinander kommunizieren können, könnte man ein Protokoll verwenden, das dem ähnelt, das viele Websites heutzutage zur Implementierung der Zwei-Faktor-Authentifizierung (2FA) verwenden, nämlich zeitbasierte Einmalpasswörter (TOTP). Dabei handelt es sich um einen Code, der aus einem Geheimnis, das nur der App des Nutzers und der Website bekannt ist, und einem Zeitstempel unter Verwendung genauer Uhren (z. B. auf der Grundlage von NTP) generiert wird. Der Nutzer erzeugt einen solchen TOTP und sendet ihn an die Website, die ihn dann mit dem von ihr erzeugten Code vergleichen kann, der identisch sein sollte.

Natürlich sollte es für einen Angreifer schwierig sein, solche TOTPs zu erraten, was der Punkt ist, an dem kryptographische Methoden ins Spiel kommen. Normalerweise verwendet man SHA-1 als Funktion, um Klartext in einen numerischen Code umzuwandeln. Da mein Mechanismus nicht mit dem Internet verbunden ist, habe ich eine einfache Hash-Funktion gewählt, die die Eigenschaft hat, ihre Schlüssel gleichmäßig über den Hash-Wert-Raum zu verteilen, das sogenannte Fibonacci-Hashing. Diese Funktion ist kryptografisch nicht sicher, aber ich erwarte keinen Kryptoangriff. Tatsächlich ist die Anzahl der Eingaben eines falschen Schlüssels, die man für solche Angriffe benötigt, sehr begrenzt.

Damit sieht das Protokoll zur Erzeugung und Überprüfung der TOTPs wie folgt aus. Um die Dinge zu vereinfachen, beschreibe ich nur eine Kommunikationsrichtung:

  1. Beide Benutzer, nennen wir sie Alice und Bob, drücken synchron einen Knopf, der an ihrem jeweiligen Standort einen Zeitstempel erzeugt.
  2. Auf dem Rechner von Alice wird der Zeitstempel zusammen mit dem jeweiligen gemeinsamen Geheimnis verwendet, um einen Hash-Wert zu erzeugen, der Alice angezeigt wird.
  3. Alice überträgt den Code an Bob.
  4. Bob gibt den empfangenen Code in seinen Rechner ein.
  5. Unter Verwendung des generierten Zeitstempels und des gemeinsamen Geheimnisses generiert Bobs Rechner ebenfalls einen Hash-Wert und vergleicht ihn mit dem empfangenen Code.
  6. Wenn der empfangene Code und der generierte Hash-Wert übereinstimmen, ist die Wahrscheinlichkeit extrem hoch, dass Alice und Bob den Knopf gleichzeitig gedrückt haben, und Bobs Box wird sich öffnen.

Natürlich wird dieses Protokoll auch mit der symmetrischen Kommunikationsrichtung unter Verwendung eines anderen gemeinsamen Geheimnisses ausgeführt.

Ein letzter Punkt ist die Frage, über welche Art von Zeitpunkten wir sprechen. Handelt es sich um eine Sekunde, eine Minute oder vielleicht eine Stunde? 2FA-TOTPs sind in der Regel eine halbe Minute lang gültig. Um zu berücksichtigen, dass TOTPs an der Grenze zwischen zwei halben Minuten erzeugt werden können, lässt man normalerweise etwas Spielraum. Ich verwende Sekunden und lasse ein paar Sekunden Differenz zu, was bedeutet, dass anstelle der Erzeugung und des Vergleichs eines Hashwertes eine Folge von Hashwerten erzeugt und mit dem empfangenen Code verglichen wird.

Cache-Box

Jetzt brauchen wir nur noch eine Box mit einer Tastatur, einem Display und einem elektrischen Schloss, um die Idee umzusetzen. Die beste Approximation, die mir eingefallen ist, ist ein Dokumentenkoffer mit digitalem Tastaturschloss, wie er auf dem rechten Bild zu sehen ist.

Das Gute daran ist, dass die Platine leicht zugänglich ist, was die Möglichkeit eröffnet, die Funktionalität zu ändern. Bevor man die Platine austauscht, sollte man natürlich erst einmal versuchen zu verstehen, was die einzelnen Komponenten eigentlich bewirken sollen. Also habe ich ein bisschen Reverse Engineering betrieben.

Platine mit elektrischen Anschlüssen

Der linke Anschluss ist für die Batterien (4 AA-Zellen), der nächste für das elektrische Schloss, der große Anschluss ist für die Matrixtastatur, und der rechte Anschluss ist für den Taster, den man betätigen muss, wenn man einen neuen Schlüsselcode eingeben will. Das einzige IC auf der Platine hat keine Beschriftung, aber ich vermute, dass es sich um eine der ultrabilligen chinesischen MCUs handelt, nämlich eine EM78P153. Zumindest die Pinbelegung ist mit dieser MCU kompatibel. Zunächst hatte ich gehofft, nur die MCU selbst austauschen zu müssen. Allerdings ist die Pinbelegung mit keinem mir bekannten ATtiny kompatibel. Zweitens müssen wir zusätzlich ein Display und eine RTC anschließen, was mit einer MCU mit so wenigen Pins (von denen einige bereits eine Doppelfunktion haben) nicht funktionieren kann.

Ansonsten sieht man auf der Platine noch eine Freilauf-Diode (D2) für das elektromagnetische Schloss und eine weitere Diode (D1), die die Batteriespannung von 6 V auf 5,3 V reduziert, was mit der MCU kompatibel ist. Hoffentlich verwendet niemand Lithium-Zellen, die 6,8 V liefern könnten, in dieser Safe-Box! Dann gibt es noch eine zweifarbige LED, die direkt von der MCU angesteuert wird. Außerdem gibt es einen PNP-Transistor (Q3), der das Schloss schaltet, und einen (Q4), der den elektromagnetischen Schallwandler schaltet. Die beiden verbleibenden PNP-Transistoren Q1 und Q2 sind als Batteriespannungswächter konfiguriert.

Prototyp

Bevor ich anfing, die Box tatsächlich zu modifizieren, habe ich erstmal einen Breadboard-Prototyp aufgebaut. Hier sieht man von links nach rechts eine Matrix-Tastatur, den elektromagnetischen Schallwandler mit Treibertransistor, die RTC, ein 0,96 Zoll (2,44 cm) OLED-Display, eine Zweifarben-LED, und einen ATmega328P.

Nachdem die neue Firmware dann zu funktionieren schien, entwarf ich meine eigene Platine und bestellte einige Exemplare, nur um festzustellen, dass ich vergessen hatte, die RTC auf der Platine zu platzieren. Bei der zweiten Iteration klappte alles, wie auf dem nächsten Bild zu sehen ist.

Die neue Platine

Wie üblich muss man am Ende mindestens eine zusätzliche Verbindung herstellen (der rote Draht). Hier ist der Batterie-Pin der RTC direkt mit der Hauptversorgungsspannung verbunden, weil die Batteriekontakte am Chronodot korrodiert sind.

Jetzt müssen wir nur noch ein Display in die Safebox einbauen. Mir gefallen die kleinen 0,96-Zoll-OLED-Displays, die man auf einem der obigen Bilder sehen kann. Aber wie bringt man sie an? Zum Glück besitze ich jetzt einen 3D-Drucker. Und man kann STL-Dateien für Gehäuse für diese OLEDs im Internet finden. Also druckte ich zwei Gehäuse aus und klebte sie auf die Safebox. Es sieht aus, als gehörten die Displays da hin.

Das endgültige „Produkt“

Jetzt noch eine Anleitung für die Cacher, eine wasserdichte (Lock&Lock) Box und etwas Tarnung, und dann muss noch ein Versteck gefunden werden. Mein Geocaching-Partner in Osnabrück hat schon ein Versteck ausgemacht, aber die Box ist noch auf dem Postweg. Es sind also nur noch ein paar Tage, bis der Geocache online geht, nachdem ich das Ganze vor fast zwei Jahren begonnen habe.

Es kann losgehen

EDIT: Mittlerweile sind die beiden Caches online: GCA3X12 und GCA3X19

Views: 20