2016-03-31 15 views
3

Ich habe bisher hauptsächlich kleinere Apps und Spiele für Android erstellt, aber ich erschaffe jetzt eine ziemlich große App mit vielen Benutzern und sensibleren Daten als ein Highscore.User Authentification on Android - Sicherheitsimplementierung

Mein normaler Ansatz war, nur eine Tabelle für alle Benutzer mit Kennwörtern zu haben, mit einem einfachen Anmeldebildschirm mit einem HTTP (S) Anruf authentifizieren und das war's.

Es gibt ein paar Dinge, die ich, obwohl für diese App verbessern möchten:

Sichere Übertragung

Wenn ich das Kennwort des Benutzers verschlüsseln wollen, wo ich es tun müssen? Auf dem Gerät, bevor es überhaupt gesendet wird? (Im Falle von unsicheren Netzwerken, wie einem öffentlichen WiFi Hotspot) Oder besser auf dem Server, bevor Sie es in die DB schreiben? Oder sollte ich nur die SQL-Verschlüsselung verwenden?

Auto Login

Ich mag Benutzer in der Lage sein, um eingeloggt zu bleiben, bis das Protokoll aus - wie würde ich das am besten tun? Nicht nur in Bezug auf die Sicherheit, sondern auch für die Benutzerfreundlichkeit.

Meine Untersuchung zeigt mir, dass die Verwendung des AccountManager am besten wäre, den Benutzernamen und das Passwort zu speichern und sich automatisch zu authentifizieren, wenn die App gestartet wird. Ist da noch etwas dran, irgendwelche Sicherheitsrisiken, die mir hier fehlen?

Zutrittskontrolle

Normalerweise würde ich erwarten, dass nur jeder von einer App gemacht Anruf gültig, da ein Benutzer nicht alles, aber der Login-Bildschirm in ohne Anmeldung zugreifen können. Aber wie ich am besten authentifizieren die Anfrage eines Benutzers, um sicherzustellen, dass es sich nicht um einen Angreifer handelt? Ich kann nicht einfach den Benutzernamen/ID mit jeder Anfrage senden, also brauche ich wahrscheinlich ein Sitzungstoken, das ich bei jeder Anmeldung erstelle? Oder gibt es eine bessere Methode?

Gibt es noch etwas, an das ich vergessen habe?

Antwort

1

Ich würde vorschlagen, dass Sie das Passwort übertragen, ohne es zu verschlüsseln, sondern durch https. Eine andere Möglichkeit wäre, asymmetric encryption in Ihrer App zu implementieren und das Passwort mit dem öffentlichen Schlüssel zu verschlüsseln, den Sie vom Server erhalten.

Auf der Serverseite würde ich Passwort mit einem Hash-Algorithmus mit Salz hash. Und speichern Sie nur Hash und Salz. Wenn sich Benutzer anmelden, können Sie eingehende Kennwörter auf die gleiche Weise überprüfen und Hashs auf Gleichheit überprüfen.

Um eine automatische Anmeldung zu machen, müssen Sie alle Anfragen von autorisierten Benutzern mit einem Token signieren. Token erhalten Sie nach erfolgreicher Anmeldung vom Server. Dieses Token könnte in Keystore oder einem speziellen Speicher gespeichert werden, auf den nur für diese Anwendung zugegriffen werden kann.

Signierung könnte implementiert werden, indem zusätzliche Parameter mit Prüfsummen aus allen Anforderungsparametern und Token angefordert werden.

Zusätzlich würde ich Ihnen vorschlagen, über nicht autorisierte Klon-Apps nachzudenken, die vorgeben könnten, Ihre App zu sein und Ihre serverseitige API aufzurufen.

+0

Danke für den Rat, obwohl ich mir nicht ganz sicher bin, was ich sonst tun kann, um jeden davon abzuhalten, Anfragen zu stellen - wenn sie sich nicht einloggen können, bekommen sie kein Token und können nichts tun, Recht? –

+0

Ja, genau.Eine andere Lösung wäre, signiertes APK zu generieren und Schlüssel aus Keystore zu verwenden, um Anforderungen an Ihre API zu signieren. Dann könnten Sie alle nicht autorisierten Anfragen aufgeben. –

+0

gute Idee, danke! –