Speichern vertraulicher Daten auf dem Gerät
Das hängt sehr von Ihrem Publikum ab. Normalerweise verbietet das Android-Betriebssystem Apps den Zugriff auf die Dateien des anderen (dh Datenbanken, Voreinstellungsdateien, reguläre Dateien, die im privaten Verzeichnis der App gespeichert sind) über bewährte Linux-Dateiberechtigungen. Auf gerooteten Geräten kann eine Anwendung jedoch Root-Zugriff erhalten und alles lesen. Ein paar Dinge zum Nachdenken:
- Wenn Sie wissen, dass Ihre Benutzer kein Root-Verzeichnis haben (z. B. wenn Sie die App nicht über Android Market, sondern nur in Ihrem Unternehmen oder ähnlichem vertreiben), können Sie sich einfach auf die dateisystembasierte Sicherheit von Android verlassen.
- Wenn ein Benutzer Root-Zugriff erhält, wird er sehr vorsichtig sein, welcher Anwendung er dieses Privileg erteilt
- Wenn eine App Root-Zugriff erhält, kann dies viel Chaos anrichten. Die Informationen in Ihrer App sind möglicherweise die geringste Sorge des Benutzers.
- Rooting führt zu keiner Garantie. Einschließlich in Apps. Sie können nicht dafür verantwortlich gemacht werden, dass Informationen auf einem gerooteten Telefon verloren gehen.
Wenn Ihre Informationen nicht besonders sensibel sind (z. B. Kreditkarteninformationen), empfehlen wir Ihnen, sich an die von Android bereitgestellte Standardsicherheit zu halten (dh alles im Klartext zu speichern, da andere Apps nicht darauf zugreifen können).
Ansonsten ist die Verschlüsselung der richtige Weg. Es ist nicht 100% sicher (ein Hacker könnte Ihre App dekompilieren und herausfinden, wie die Daten entschlüsselt werden), aber es ist ein großer Schmerz zu knacken und wird die meisten Hacker stoppen. Vor allem, wenn Sie Ihren Code mit etwas wie ProGuard verschleiern .
Übertragen vertraulicher Daten vom Server auf das Gerät
Sie haben hier einige Möglichkeiten. Verwenden Sie zunächst immer HTTPS. Nach dem Aktivieren von HTTPS möchte ich zwei zusätzliche Sicherheitsmaßnahmen vorschlagen:
- Verwenden Sie ein API-Schlüsselsystem. Nehmen Sie diesen API-Schlüssel in alle Ihre Anforderungen auf und überprüfen Sie ihn auf der Serverseite, bevor Sie eine Antwort zurücksenden. Denken Sie daran, dass ein Angreifer, da Sie HTTPS verwenden, nicht nur einen Netzwerk-Sniffer verwenden kann, um Ihren API-Schlüssel herauszufinden. Dies ist jedoch ziemlich einfach herauszufinden, ob jemand Ihre App dekompiliert, weshalb Sie sie (neben der Verwendung von ProGuard) noch weiter verschleiern können. Beispielsweise können Sie den API-Schlüssel rund um Ihren Code in Teile zerlegen lassen (z. B. als statische Elemente in zwei oder drei Klassen). Wenn Sie dann eine Anfrage senden, verketten Sie einfach alle diese Teile. Sie können sogar eine andere Art von Transformation anwenden (z. B. Bitverschiebung), um das Herausfinden aus dem dekompilierten Code noch schwieriger zu machen.
- Sie können jedes Mal, wenn Sie eine Anfrage senden, einen Schlüssel generieren. Dieser Schlüssel wird mithilfe einer Logik generiert, die nur Sie kennen, sodass Sie ihn auch clientseitig und serverseitig implementieren können. Eine Anforderung kann beispielsweise die folgenden Parameter enthalten:
time=1321802432&key=[generated-key]
wobei generated-key
aus dem time
Parameter generiert wird. Zum Beispiel : md5(time + salt)
. Wenn der Server diese Anforderung empfängt, kann er zwei Dinge tun:
- Überprüfen Sie, ob dies
key
tatsächlich gleich ist md5(time + salt)
(beachten Sie, dass nur der Client und der Server das Salt kennen und es ähnlich wie der obige API-Schlüssel verschleiert werden kann)
- Stellen Sie sicher, dass dies
time
nicht zu weit zurückliegt (z. B. wenn es in der Vergangenheit länger als 1-2 Minuten dauert, betrachten Sie die Anforderung als ungültig).
Die zweite Methode ist nützlicher, wenn Sie auch einfache HTTP-Anforderungen ausführen, bei denen jeder die gesendeten Parameter sehen kann. Außerdem ist es viel schwieriger, aus dekompiliertem Code herauszufinden. Insbesondere, wenn Sie die Schlüsselberechnungslogik auf mehrere Klassen verteilen.
Beachten Sie jedoch , dass nichts es unmöglich macht, Ihre App zu knacken. Sie können so viel verschleiern, wie Sie möchten. Wenn ein Hacker wirklich entschlossen ist, auf Ihre Daten zuzugreifen, kann er dies tun, indem er Ihre Anwendung dekompiliert und viele schlaflose Nächte damit verbringt, Ihren Code zu durchlaufen und herauszufinden, wie die Anforderungen gebildet werden. Die einzige wirkliche Möglichkeit, Ihre Daten zu sichern, besteht darin, Ihren Benutzer nach einem Passwort zu fragen und alle Arbeiten auszuführen, über die ich oben geschrieben habe. Sie können aus dekompiliertem Code kein Passwort erhalten, das nur im Kopf einer Person (des Benutzers) vorhanden ist :).