Problemlos tippen am Laptop

Auf den meistens Laptops sind sehr brauchbare Tastaturen angebracht, so auch auf meinem neuen XMG. So braucht man zum Arbeiten als Extra nur noch eine Maus, da Touchpads eher unhandlich zu bedienen sind. Nun tippe ich in der Regel mit abgespreizten Daumen (aus Gründen), die gelegentlich das Touchpad berühren. Dann springt der Cursor wo auch immer der Mauszeiger gerade ist und man tippt fröhlich ins falsche Feld 🙁 Also schaltet man das Touchpad aus. Sobald man aber mal seine Maus vergessen hat oder man zu faul ist wegen einer kurzen Email die Maus zu suchen, muss man sich mit der Tastatur zu den Einstellungen des Touchpads quälen. Das nervt! Das folgende Bash-Skript deaktiviert das Touchpad falls eine Maus angeschlossen ist. Problem gelöst.

 

Come In And Find Out

Wenn man aus dem alltäglichen Irrgarten von ASP.Net und Backendsystemen mal ausbrechen will, hilft es sich mal ein fachfremdes Buch zu greifen. An dieser Stelle möchte ich Mazes for Programmers von Jamis Buck empfehlen.

Mazes for Programmers
Mazes for Programmers

Es gibt dem geneigten Programmierer einen Einstieg in die Erzeugung von Labyrinthen verschiedener Arten. Ob mit vielen Sackgassen oder mit wenigen Windungen, die detaillierten Beschreibungen der Algorithmen erleichtern die Implementierung. Jamis Buck hat sich entschieden die Beispiele in Ruby zu schreiben. Ich beherrsche kein Ruby und finde es gelegentlich verwirrend zu lesen, aber die Beispiele in C# zu implementieren war ein Kinderspiel. Sehr schnell stellt sich der Spieltrieb ein und man möchte an den Labyrinthen rumspielen und diese den eigenen Wünschen anpassen. Das Buch unterhält mehr als nur einen Nachmittag und ist eine klare Empfehlung von mir. Wer weiß, vielleicht komme ich mal in die Verlegenheit ein Labyrinth zu erzeugen.

maze-RecursiveBacktracker-16x16-(27)

Spielstand-Crypto

Es ist immer wieder schön, wenn ich mich mit Crypto beschäftigen kann. Nicht weil ich ein Experte auf diesem Gebiet bin, sondern weil es mich einfach unabhängig von meiner Qualifikation einfach sehr interessiert. Ich bin kein Kryptograph. Bei dieser Gelegenheit ging es darum den Spielstand (Savegame) eines Spiels „sicher“ zu speichern. Dazu gehört als erstes definiert, was man als einen sicheren Spielstand versteht.

  • Geheim – der Inhalt des Spielstandes darf nicht lesbar sein
  • Korrekt – der Inhalt des Spielstandes darf nicht manipulierbar sein

In den den meisten Fällen muß ein Spielstand nicht geheim sein. Es gibt keine Vertraulichkeit darüber, welche Gegenstände im Inventar sind, wie hoch der Highscore ist oder wieviel Lebensenergie der Spieler gerade hat. Darüber hinaus ist ein von Menschen lesbarer Spielstand zu bevorzugen. Es erleichtert bei der Entwicklung einiges wie Fehlersuche oder das Testen. Aber korrekt muß ein Spielstand immer sein! Einfach mal mehr Gold oder Lebensenergie in einen Spielstand zu schreiben ist in aller Regel nicht schwer. In der Regel schadet es keinem, wenn Spieler sich auf diesem Wege das Spiel leichter machen.

Zusammen gefasst wird klar, daß der Spielstand niemals auf Seite des Spielergespeichert werden sollte, wenn man einen sicheren Spielstand benötigt. Dazu zählen besonders Daten für Mehrspielerspiele oder High Scores für Ranglisten. Daraus folgt, daß „alles in die Cloud“ oder zumindest auf einen Server gespeichert werden muß. Das ist einfach nicht immer praktikabel und Always Online ist für viele Spiele einfach nicht sinnvoll.

Hohe Hürden

Was kann man also tun, wenn man akzeptiert hat, daß man eigentlich nicht gewinnen kann? Man muß es einem mogelnden Spieler so schwer wie möglich zu machen. Der naive Ansatz wäre einfach Binärdaten zu schreiben, da die meisten Menschen diese nicht lesen können. Allerdings hat das schon vor 20 Jahren keine 13-Jährige mit Hexeditor aufgehalten. Zusätzlich verliert man die Vorteile der menschenlesbaren Spielstände.

In meinem konkreten Fall habe ich mich für schnödes XML entschieden. Die De-/Serialisierung ist in aller Regel bereits erschlagen, der Aufwand ist gering. Zum Schutz vor Manipulationen erzeuge ich einen HMAC mit dem der Spielstand signiert wird. Auch das muß nicht selber implementieren, wieder Zeit gespart. Damit wird jeder Manipulationsversuch erkannt. Darüber hinaus kann man die Nachricht mit einer Nutzerkennung oder eine Geräte-ID versehen. Der Spielstand ist so auch an einen Nutzer oder ein Gerät gebunden. Einfaches Tauschen von gültigen Spielständen wird damit unterbunden. Problematisch ist natürlich, daß das Geheimnis zum Signieren im Programm vorliegt. Ein motivierter Angreifer wird diesen finden.

Ob dieses Vorgehen genügt um Ranglisten vor unmöglichen Rekorden schützen wird die Zeit zeigen. Irgendwie freue ich mich auf ein mögliches Wettrüsten. Obwohl in letzter Konsequenz nur das Speichern außerhalb der Reichweite der Spieler erfolgversprechend ist. Dieses Vorgehen hält aber auch ganz andere Fallstricke bereit.