Ja, dies ist eine ziemlich allgemeine Frage, aber ich versuche ein Gefühl dafür zu bekommen, wie man eine App, die die Basis berührt, am besten mit einem Webserver behandelt, der vertrauliche Daten an die App verteilt. Alle Links, allgemeine Informationen usw. wären dankbar.
Da die App persistente Daten speichert, die für eine bestimmte Zeit aus der Datenbank abgerufen wurden, wird alles etwas empfindlich.
Antworten:
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 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:
time=1321802432&key=[generated-key]
wobei
generated-key
aus demtime
Parameter generiert wird. Zum Beispiel :md5(time + salt)
. Wenn der Server diese Anforderung empfängt, kann er zwei Dinge tun:key
tatsächlich gleich istmd5(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)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 :).
quelle
(Kam hierher dank einer Google-Suche)
Ich habe in letzter Zeit viel recherchiert und diese Seite ist dank der Google- und Bing-Suche viel aufgetaucht. Das allgemein akzeptierte Verfahren zum sicheren Speichern von Daten auf dem Gerät war die Verwendung eines starken Verschlüsselungsalgorithmus wie AES. Die schwierigere Frage lautet: "AES benötigt einen sicheren Schlüssel. Was machen Sie mit dem Schlüssel?"
Google hat kürzlich eine Cloud-basierte Speicherlösung für Apps angekündigt, sodass Sie den Schlüssel dort speichern können, wenn die Situation dies zulässt. Ansonsten scheint es besser zu sein, den Schlüssel außerhalb des Geräts zu erhalten, wie auf einem Server. Wenn Sie den Benutzer dazu bringen können, eine PIN einzugeben, funktioniert dies am besten. Sie können eine Kennwortableitung durchführen, um das Kennwort zu speichern, und Sie können die Ableitung wiederholen, um das Kennwort zu überprüfen
Ohne den Teil "Benutzer, der eine PIN eingibt" habe ich nicht viele gute Antworten auf diese Frage gefunden. HARD-CODEIEREN SIE DEN SCHLÜSSEL jedoch NICHT, WENN SIE EINEN MIT DER APP SPEICHERN MÜSSEN. Generieren Sie mindestens einen Schlüssel mit einem sicheren Passwortgenerator und / oder einer Ableitungsfunktion wie PBKDF2 (Passwortbasierte Ableitungsfunktion 2).
Wenn ich die Beiträge richtig gelesen habe, hat Google gesagt, dass ein Ansatz darin besteht, beim ersten Start der App einen Schlüssel zu generieren, den Schlüssel über das MODE_PRIVATE-Flag für viele Datei-E / A-Vorgänge zu speichern und diesen als Schlüssel zu verwenden. Sie können auch andere Schlüssel basierend auf diesem Hauptschlüssel ableiten, und der NIST schlägt tatsächlich etwas in dieser Richtung vor.
Ob Sie der Master-Key-Methode vertrauen oder nicht, überlasse ich Ihnen. Dieser Schlüssel wird auf einem gerooteten Gerät angezeigt. Ich gebe auch zu, dass ich das Problem noch erforsche
quelle
Jede Anwendung unter Android wird in einer sicheren Sandbox-Umgebung ausgeführt, sodass andere Prozesse auf dem System ohne ordnungsgemäßen Handshake nicht auf Ihren Code oder Ihre privaten Daten zugreifen können. Trotzdem gibt es viele Schwachstellen, die durch schlechtes Design der Apps möglich sind. Dieser Link von der Android-Entwickler-Website gibt Ihnen einige gute Tipps für die Sicherheit - https://developer.android.com/training/articles/security-tips.html
quelle
Wenn Sie so ziemlich sicherstellen möchten, dass der Benutzer die Daten nur durch Betrachten Ihrer App sehen kann, ist die Verschlüsselung wirklich der einzige Weg. Selbst der "geschützte" Speicher ist für den Benutzer zugänglich, wenn ein Gerät gerootet ist. Selbst die Verschlüsselung ist nicht vollständig sicher, da Sie die Daten irgendwann entschlüsseln müssen, um sie anzuzeigen. Sie werden den Gelegenheitsbrowser davon abhalten, aber nicht den entschlossenen Hacker.
quelle
Verwenden Sie SSL unter HTTPS, um Daten anstelle von HTTP zu übertragen. Sie müssen die Zertifikate auf dem Webserver einrichten. Sie sind sich nicht sicher, wie es funktioniert.
Wenn Sie wirklich besorgt über die Daten sind, verschlüsseln Sie sie mit einem eindeutigen Algorithmus, bevor Sie sie senden und entschlüsseln, wenn sie die App erreichen. Ich denke, das ist alles. Wenn Sie nicht etwas wirklich Starkes benötigen, entwickeln Sie Ihr eigenes Protokoll auf TCP-Basis und / oder verwenden Sie einen anderen Port. Vielleicht hilft das
http://en.wikipedia.org/wiki/Secure_Sockets_Layer http://developer.android.com/reference/javax/net/ssl/package-summary.html http://blog.synyx.de/2010/06/ android-and-self-signierte-ssl-zertifikate /
Zum Speichern von Daten in der App können Sie die Daten vor dem Speichern verschlüsseln oder für eine bessere Sicherheit ein anderes Format als SQLite verwenden, da Sie SQLite-Datenbanken ganz einfach mit dem Browser anzeigen können.
Solange das Telefon nicht gerootet ist, sollte es keine Möglichkeit geben, die Daten daraus zu extrahieren.
quelle