Private Homepage von Thomas Presberger

Friends Radar (Android App)

Diese App zeigt dir, ob die von dir ausgewählte Freunde in deiner Nähe sind - natürlich vorausgesetzt diese haben auch diese App installiert und sich mit ihrer Telefonnummer angemeldet! Von deiner Telefonnummer wird nur ein SHA-256 Hash an den Freunde-Server übertragen.

Die App läuft dann im Hintergrund und sendet deinen Standort in von dir einstellbaren Abständen (z.B. aller 10 min) an diesen Freunde-Server. Kommt dann ein(e) Freund(in) in einen einstellbaren Enfernungsradius (z.B. 100 m), bekommst du eine Notification. Dann kannst diesem Freund/dieser Freundin direkt aus dieser App einen Nachricht senden und z.B. fragen, ob er/sie sich mit dir treffen möchte ...

Der genaue Ort der Freunde soll in der App*nicht*angezeigt werden, nur die Entfernung. Damit soll ein gewisser Grad an Privatsphäre gewahrt bleiben - schließlich will nicht jeder seinen Freunden*immer*seinen genauen Standort preisgeben!

Es wird auf neue Designelemente der aktuellen Android-Versionen verzichtet, damit die App abwärtskompatibel bis Android 2.3 (API-Level 9) bleibt und so auch noch auf älteren Geräten (z.B. Samsung Galaxy S1) läuft.

Sicherheitskonzept

Von den Telefonnummern werden Hashs gebildet, die auf Gleichheit getestet werden können. Nur die Hashs werden über das Internet übertragen. Aus einem Hash kann nicht die zugrundeliegende Telefonnummer rekonstruiert werden.
Die Koordinaten und die Nachrichten werden Ende-zu-Ende in der App ver- und entschlüsselt. Momentan wird noch eine symetrische Verschlüsslung (AES/CBC/PKCS5Padding) mit 256 Bit Schlüssel verwendet. Eine individuelle asymmetrische RSA-Verschlüsslung mit Public- und Privat Key ist in Vorbereitung.
Der Google Cloud Messaging (GCM) Service wird benutzt um dem App-Hintergrunddienst mitzuteilen, dass eine Nachricht auf dem Server liegt und die App kann diese dann sofort abholen und nicht erst in dem eingestellten Intervall. Über die Google Cloud werden keine Nachrichten übertragen.

Energiesparkonzept

Das Grundproblem ist: damit die App sinnvoll funktioniert, muss der eigene Standort so oft wie möglich ermittelt werden. Geschieht dies bei zwei Freunden z.B. nur aller 10 Minuten, kann es im ungünstigsten Fall bis zu 20 Minuten dauern, bis ein aktueller Abstand und damit eine eventuelle Annäherung ermittelt werden kann. Da ist man mit Auto oder Fahrrad natürlich längst aneinander vorbei gefahren! Deshalb sollte das Update-Intervall möglichst auf 3 Minuten gestellt werden.
Die Ermittlung des Standort mittels GPS aller 3 Minuten kostet natürlich Strom und damit Akkulaufzeit. Damit dies nicht unnötig passiert, wird mittels des Bewegungssensor des Handys (ist immer aktiv und kostet keinen zusätzlichen Strom) gecheckt, ob dieses auch bewegt wird oder nur irgendwo abgelegt ist (wenn man z.B. nachts schläft). Darüberhinaus wird die GPS-Standortermittlung immer nur für 1 Minute aktiviert - wenn in dieser Zeit kein Standort ermittelt werden konnte, wird die Suche in diesem Fall erfolglos abgebrochen.

Datensparkonzept

Um das Datenvolumen des Nutzers nicht übermäßig zu strapazieren, werden in den Update-Intervalls so wenig wie möglich Daten gesendet und empfangen. Das Datenvolumen ist natürlich höher bei einem kürzerem Intervall. Mit der Einführung des Google Cloud Messaging Service ist zumindest die permanente Abfrage nach neuen Nachrichten nicht mehr nötig. Trotzdem sollte man, wenn man z.B. im Ausland einen teueren Datentarif mit wenig Volumen hat, das Update-Intervall auf 10 Minuten stellen oder den Background-Service ganz deaktivieren (aber nicht vergessen wieder einzuschalten, wenn zurück ;-)


Download App

Version vom 25.10.2015

Permission Warum?
ACCESS_COARSE_LOCATION Die App muss den Ort ermitteln können (grob -> Mobilfunk)
ACCESS_FINE_LOCATION Die App muss den Ort ermitteln können (fein -> GPS)
INTERNET Die App benötigt Internet für die Kommunikation mit dem Server
ACCESS_NETWORK_STATE Die App benötigt Netzwerkstatus für die Kommunikation mit dem Server
ACCESS_WIFI_STATE Die App benötigt WLAN-Status für die Kommunikation mit dem Server gegebenenfalls über WLAN
READ_PHONE_STATE Wird benötigt, um die eigene Telefonnummer auszulesen
READ_CONTACT Nur aus den Kontaktdaten der hinzugefügten Freunde werden Name, Telefonnummer und das Kontaktbild ausgelesen
VIBRATE Für Notifications mit Vibration
RECEIVE_BOOT_COMPLETED Wird benötigt, um nach einem Geräte-Neustart den App-Hintergrunddienst neu zu starten
WRITE_EXTERNAL_STORAGE Die lokale Datenbasis kann auf SD-Karte gesichert werden (backup)
READ_EXTERNAL_STORAGE Die lokale Datenbasis muss von SD-Karte wieder gelesen werden können (restore)
WAKE_LOCK Die App darf sich nicht während der Internetkommunikation ausschalten
com.google.android.c2dm.permission.RECEIVE Wird für das Google Cloud Messaging benötigt
GET_ACCOUNTS Wird für das Google Cloud Messaging benötigt