Der beste Weg, um sensible Daten für Android-Apps zu sichern?

73

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.

DJPlayer
quelle
Ist die Datenbank nicht eine gute Wahl für die Speicherung vertraulicher Informationen?
Gegen wen sichern? Der legitime Benutzer Ihrer App, ein Telefondieb, ein Virus, ...
CodesInChaos

Antworten:

103

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:

  1. 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.
  2. Wenn ein Benutzer Root-Zugriff erhält, wird er sehr vorsichtig sein, welcher Anwendung er dieses Privileg erteilt
  3. 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.
  4. 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:

  1. 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.
  2. 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-keyaus dem timeParameter generiert wird. Zum Beispiel : md5(time + salt). Wenn der Server diese Anforderung empfängt, kann er zwei Dinge tun:
    1. Überprüfen Sie, ob dies keytatsä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)
    2. Stellen Sie sicher, dass dies timenicht 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 :).

Felix
quelle
Nun, ich weiß, ich hatte etwas ziemlich Komplexes im Sinn, Token und Authentifizierung im Vergleich zu einem Server usw. für ein anderes mobiles System zu verwenden. Nun, was sie für Android vorgeschlagen wurden, war viel einfacher mit API-Schlüsseln auf der Serverseite gespeichert. Wie stehen Sie zur Sicherheit mit statischen API-Schlüsseln? (Dies war zumindest die allgemeine Idee, die ich aus zweiter Hand hörte).
DJPlayer
Informationen zu Proguard sind auf jeden Fall von Vorteil. Sie müssen auf jeden Fall die Dokumentation überprüfen.
DJPlayer
Anfangs habe ich nur darüber gesprochen, wie man Daten sicher auf dem Gerät speichert. Ich habe meine Antwort jetzt bearbeitet, um darüber zu sprechen, wie Daten auch sicher vom Server auf das Gerät übertragen werden können. Schauen Sie mal rein :)
Felix
Im Allgemeinen sieht das ziemlich genau so aus, wie ich es mir vorgestellt habe. Ich wollte definitiv einen MD5-Einweg-Hashing-Algorithmus verwenden. Schließlich möchten wir auf zahlreiche interne webbasierte Apps zugreifen und dieselben Anmeldeinformationen zur Authentifizierung verwenden. Die Verwendung von Token wäre nett. Dies würde es dem Benutzer ermöglichen, auf zahlreiche Bereiche zuzugreifen, sobald er angemeldet ist, und eine schöne Standardzeitüberschreitung zu ermöglichen. Leider müssten wir zu Beginn wahrscheinlich etwas einfacher anfangen. Dies ist wahrscheinlich ein ziemlich guter Anfang. Wir möchten nicht, dass der Benutzer jedes Mal ein pwd eingeben muss, wenn das Tablet eine Pause einlegt. Danke.
DJPlayer
@Felix Warum nicht das verwenden, was bereits mit Oauth dafür erfunden wurde ?
GoRoS
14

(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

Joe Plante
quelle
Irgendwelche Fortschritte jetzt?
Mike Yang
1

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

Vinayak Bevinakatti
quelle
0

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.

Kuffs
quelle
Diese Geräte befinden sich im Besitz des Unternehmens. Daher können wir die Geräte über einen Mobile Device Manager in angemessenem Umfang steuern. Auf anderen Geräten ist es geplant, Token mit Authentifizierung zu verwenden, die auf einem aktiven Server ausgeführt werden, nachdem etwas wie Siteminer durchlaufen wurde. Leider ist die Schlüsselbund-API nur ein Teil von 4.0. Verwenden Sie wahrscheinlich einen 1-Wege-Hashing-Algorithmus, um den Benutzer zu überprüfen.
DJPlayer
0

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.

Rejinderi
quelle
2
Ich bin nicht mit der Philosophie "Schreiben Sie Ihr eigenes Sicherheitsprotokoll" einverstanden. Sie könnten versehentlich alte einführen und wir werden Sicherheitslücken kennen, die von keiner Community unterstützt werden (da es ein Geheimnis sein muss). Auch in der offiziellen Dokumentation von Android ist klar geschrieben, dass dies kein guter Weg ist: "Wenn Sie einen sicheren Tunnel benötigen, sollten Sie HttpsURLConnection oder SSLSocket verwenden, anstatt Ihr eigenes Protokoll zu schreiben." Src: developer.android.com/training/articles/security-tips.html
Thecave3
Ich beziehe mich darauf, weiterhin TCP zu verwenden, um ein eigenes Protokoll darüber zu entwickeln, und bekannte Kryptografiealgorithmen zu verwenden, um die Nutzdaten zu verschlüsseln. Viele Spiele mit dauerhaften Verbindungen tun dies, um die in http / https eingeführte Nutzlast zu reduzieren und es dem Benutzer zu erschweren, den verwendeten kryptografischen Algorithmus zu erraten. Ich fordere den Benutzer nicht auf, ein völlig neues Protokoll für Raw-Sockets zu entwickeln.
Rejinderi