2016-03-29 15 views
0

Ich authentifiziere mit Schwammycastle PKCS10CertificationRequest CSR an eine RESTful Certificate Authority. Ich überlege, Android Authenticator zu verwenden.Android-Authentifikator SPEICHERN EIN CRYPTOGRAPHICAL SECURE TOKEN

Nach: https://stuff.mit.edu/afs/sipb/project/android/docs/training/id-auth/custom_auth.html#Security

Es ist wichtig zu verstehen, dass Accountmanager ist keine Verschlüsselung Service oder ein Schlüsselbund. Es speichert Kontoanmeldeinformationen, so wie Sie sie im Klartext übergeben. Bei den meisten Geräten ist dies kein besonderes Problem, , weil es sie in einer Datenbank speichert, die nur für root zugänglich ist. Aber auf einem gerooteten Gerät, die Anmeldeinformationen würden von jedem mit adb Zugriff auf das Gerät gelesen werden.

In diesem Sinne sollten Sie das tatsächliche Kennwort des Benutzers nicht an AccountManager.addAccountExplicitely() übergeben. Stattdessen sollten Sie A CRYPTOGRAPHICAL SECURE TOKEN aufbewahren, die für einen Angreifer von von begrenztem Nutzen wäre.

Meine Fragen: Ich bin mir nicht sicher, was von STORE Ein kryptografisch sicheren TOKEN in diesem Zusammenhang gemeint ist. Wie sieht dieses Token (sein Typ?) In Android Java aus? Und wo es zu speichern? im KeyChain ?? Wird dieses Token in einem anderen Kontext als dem Pw in addAccountExplicitly() verwendet?

Antwort

0

Wenn Ihr Gerät über umfangreiche Eingabefunktionen verfügt (Benutzer kann Benutzername \ Passwort eingeben), sollten Sie in Betracht ziehen, so etwas wie JWT auth. In diesem Fall behält Ihre App niemals ein tatsächliches Benutzerpasswort, sondern sendet es nur einmal pro Authentifizierungssitzung an den Server und erhält ein JWT (JSON-Web-Token) zurück. Dies ist ein Token mit einigen Informationen (z. B. mit einem Link zur Benutzerressourcen-ID oder Uuid) und einem TTL-Parameter, der mit einem geheimen Schlüssel sicher signiert wurde. Dieser geheime Schlüssel lebt nur auf dem Server, sodass niemand außerhalb Ihres Servers ein gültiges Token generieren kann.

Nach der Authentifizierungsanforderung speichern Sie JWT localy und verwenden Sie es im Header "Authorization" oder als Anfragefeld (die erste Option ist besser, da der Anfragetext in Protokollen angezeigt werden kann) mit jeder API-Abfrage. Sie sollten dieses Token erneuern, bevor es abläuft, und wenn es abgelaufen ist, dann bitten Sie den Benutzer, seine Anmeldeinformationen erneut einzugeben. Von der Serverseite erhalten Sie eine Anfrage, validieren ein Token (ist es mit dem geheimen Schlüssel des Servers signiert und ist es nicht abgelaufen?) Und im Falle eines gültigen Tokens eine Anfrage. Sie müssen Tokens nicht einmal auf dem Server aufbewahren, aber Sie möchten es vielleicht tun, wenn Sie mehr Kontrolle über die Authentifizierung haben möchten - zum Beispiel, wenn Sie Tokens außerhalb des Anwendungs-Workflows widerrufen wollen.

Es gibt eine Liste mit vielen Bibliotheken für JWT für verschiedene Sprachen auf der JWT-Site. Wenn Sie beispielsweise mit Elixir \ Phoenix arbeiten möchten, können Sie Guardian verwenden. Von Android-Teil in einem einfachen Fall müssen Sie nicht einmal ein spezielles Werkzeug für die Arbeit mit JWT haben - einfach Token als eine einfache Textzeichenfolge in den Header "Authorization" und senden Sie eine Anfrage an den Server. Aber wenn Sie Informationen, die Ihr Server von der Appseite an den Token gesendet hat, entschlüsseln oder die Token-Verfallszeit prüfen wollen, müssen Sie eine der auf der jwt-Site präsentierten Bibliotheken verwenden.