it-swarm.com.de

Wie authentifizieren beliebte Apps Benutzeranforderungen von ihrer mobilen App an ihren Server?

Angenommen, ich habe eine Android -Anwendung, die eine Verbindung zu einer .Net-API herstellt, um Daten zu empfangen/einzustellen. Die Verwirrung, die ich habe, besteht darin, wie ich den Benutzer zum ersten Mal anmelden/anmelden und ihn jedes Mal authentifizieren soll, wenn er eine Anfrage an die API stellt.

  • Wenn ich nur eine auf Benutzernamen/Passwort basierende Authentifizierung verwende, sind sie nicht sicher genug?
  • Und ich kann den Benutzernamen/das Passwort aus Sicherheitsgründen nicht im Gerät speichern?
  • Sollte ich für jeden Benutzer bei der Anmeldung eine GUID ausgeben, diese auf seinem Gerät speichern und jedes Mal während einer API-Anforderung abrufen?

Welche anderen Muster verfügbar sind und welche am effizientesten und sichersten sind, dafür brauche ich nur einen Prozessablauf. Kann mir jemand sagen, welche Methode berühmte Android Anwendungen wie Facebook, FourSquare oder Twitter verwenden, um jede Anfrage von ihrer mobilen Anwendung an ihren Server zu authentifizieren?

Entschuldigung im Voraus, wenn dies keine öffentlichen Informationen sind.

103
Maven

Ich stelle mir vor, dass sie ein "Token" -basiertes Sicherheitssystem verwenden, sodass das Passwort nirgendwo gespeichert wird und nur beim ersten Mal zur Authentifizierung verwendet wird. Die App sendet also zunächst den Benutzernamen/das Kennwort (über SSL) und der Server gibt ein Token zurück, das von der App gespeichert wird. Bei nachfolgenden Synchronisierungsversuchen wird das Token zuerst gesendet, der Server überprüft, ob es gültig ist, und ermöglicht dann das Posten anderer Daten.

Das Token sollte einen Ablauf haben, damit der Server einen erneuten Authentifizierungsversuch anfordern kann.

Wenn Sie sich innerhalb des Android Frameworks an den Synchronisierungsadapter anschließen, haben Sie die Möglichkeit, alle unter der Haube zu synchronisieren und zu authentifizieren.

http://developer.Android.com/training/sync-adapters/creating-sync-adapter.html

Wenn Sie die Konten unter Einstellungen auf Ihrem Gerät überprüfen, werden Sie sehen, was ich meine.

45
simon

Grundsätzlich verwenden diese berühmten OAuth Protokoll (1)/Framework (2). Obwohl es sich um einen Standard handeln muss, hatte jeder von ihnen unterschiedliche Implementierungen dieses Protokolls/Frameworks. So müssen wir sein sehr vorsichtig, wenn es um Integration geht.

Beispiel: Dropbox verwendet weiterhin OAuth 1 und hat kürzlich OAuth 2 unterstützt.

Zurück zur Antwort, Wie Peterpan feststellte, handelt es sich um eine tokenbasierte Authentifizierungsmethode, die einmalig ist und nicht mehr in Frage kommt. In einigen Fällen sind diese Token abgelaufen oder der Entwickler erhält diese Berechtigung.

Das Interessante daran ist, dass der Umfang des Ressourcenzugriffs definiert werden kann, anstatt dass die Clientanwendung die Benutzernamen und Passwörter behält, was gefährlich ist.

Dies ist die grundlegende Darstellung, wie dies funktioniert.

enter image description here

Ich werde die Antwort aktualisieren, nachdem ich mehr Details dazu erhalten habe, da ich in diesen Tagen in diesem Bereich arbeite :)

18
diyoda_

Ich suchte genau das Gleiche und fand Google Way, so etwas wie Peterpan, aber über Google APIs. Versuchen Sie diesen Link und googeln Sie sich durch, ich fange auch an! Ich werde neue Infos posten, während ich dabei bin!

http://developer.Android.com/google/auth/http-auth.html

3
Vitor Mendes

Ich bin Neuling, aber ich werde versuchen, eine logische Lösung für die gegebene Frage zu finden.

Es gibt zwei Optionen: [1] Für jeden URI wird eine http-Authentifizierung durchgeführt, bei der die eingegebenen Anmeldeinformationen des Benutzers überprüft werden und der Benutzer auf Ressourcen zugreifen kann.

[2] Ein anderer Ansatz könnte sein, dass ein Benutzer authentifiziert wird und bei jeder Authentifizierung ein eindeutiger Token generiert wird. Mit dem generierten Token muss der Benutzer auf Ressourcen zugreifen.

Ich bin mir jedoch nicht sicher, welcher Ansatz für die mobile Anwendung am besten geeignet ist.

3
imbond

Authentifizierungsbeispiel ist ein guter Anfang. Android speichert Anmeldeinformationen im Account Manager, Sie können Konten in den Android-Einstellungen anzeigen. Dadurch werden automatisch Token gespeichert, der Benutzer wird zur Eingabe von Anmeldeinformationen aufgefordert, wenn diese abgelaufen sind oder fehlen, Token werden aktualisiert usw. Ich finde den http-Teil Das Erweitern von AccountAuthenticatorActivity für Android ist ein hervorragender Helfer, um serialisierte Daten in das Layout und zurück ins Internet zu übertragen.

3
Pomagranite

Wenn ich nur eine auf Benutzernamen/Passwort basierende Authentifizierung verwende, sind sie nicht sicher genug?

Nein, da Sie nur den [~ # ~] identifizieren, der [~ # ~] auf den API-Server zugreift, nicht jedoch den [~ # ~] was [~ # ~] darauf zugreift.

Der Unterschied zwischen WHO und WAS greift auf den API-Server zu

Um die Unterschiede zwischen dem [~ # ~], der [~ # ~] und dem [~ # ~] Was [~ # ~] auf einen API-Server zugreift, verwenden wir dieses Bild:

Man in the Middle Attack

Der beabsichtigte Kommunikationskanal stellt die mobile App dar, die von einem legitimen Benutzer ohne böswillige Absichten erwartungsgemäß verwendet wird, wobei eine nicht manipulierte Version der mobilen App verwendet wird und die direkt mit dem API-Server kommuniziert, ohne dass man mitten angegriffen wird.

Der tatsächliche Kanal kann mehrere verschiedene Szenarien darstellen, z. B. ein legitimer Benutzer mit böswilligen Absichten, der eine neu gepackte Version der mobilen App verwendet, ein Hacker, der die Originalversion der mobilen App verwendet, und ein Mann in der Mitte, der sie angreift, um zu verstehen, wie Die Kommunikation zwischen der mobilen App und dem API-Server erfolgt, um Angriffe auf Ihre API automatisieren zu können. Viele andere Szenarien sind möglich, aber wir werden hier nicht alle auflisten.

Ich hoffe, dass Sie jetzt schon eine Ahnung haben, warum die [~ # ~] wer [~ # ~] und die [~ # ~] was [~ # ~] nicht dasselbe ist, aber wenn nicht, wird es in einem Moment klar.

Der [~ # ~], der [~ # ~] der Benutzer der mobilen App ist, die wir auf verschiedene Arten authentifizieren, autorisieren und identifizieren können, z unter Verwendung von OpenID Connect- oder OAUTH2-Flows.

[~ # ~] oauth [~ # ~]

Im Allgemeinen bietet OAuth Clients einen "sicheren delegierten Zugriff" auf Serverressourcen im Namen eines Ressourcenbesitzers. Es gibt einen Prozess an, mit dem Ressourcenbesitzer den Zugriff von Drittanbietern auf ihre Serverressourcen autorisieren können, ohne ihre Anmeldeinformationen zu teilen. OAuth wurde speziell für die Verwendung mit HTTP (Hypertext Transfer Protocol) entwickelt und ermöglicht im Wesentlichen die Ausgabe von Zugriffstoken an Clients von Drittanbietern durch einen Autorisierungsserver mit Genehmigung des Ressourcenbesitzers. Die dritte Partei verwendet dann das Zugriffstoken, um auf die geschützten Ressourcen zuzugreifen, die vom Ressourcenserver gehostet werden.

OpenID Connect

OpenID Connect 1.0 ist eine einfache Identitätsschicht über dem Protokoll OAuth 2.0. Es ermöglicht Clients, die Identität des Endbenutzers anhand der von einem Autorisierungsserver durchgeführten Authentifizierung zu überprüfen und grundlegende Profilinformationen über den Endbenutzer auf interoperable und REST-ähnliche Weise abzurufen.

Während die Benutzerauthentifizierung dem API-Server möglicherweise mitteilt , [~ # ~] wer [~ # ~] die API verwendet, kann nicht garantiert werden, dass die Anforderungen erfüllt sind entstand aus [~ # ~] was [~ # ~] Sie erwarten, die Originalversion der mobilen App.

Jetzt müssen wir einen Weg finden, um zu identifizieren , [~ # ~] was [~ # ~] den API-Server aufruft, und hier werden die Dinge kniffliger als die meisten anderen Entwickler mögen denken. Das [~ # ~] was [~ # ~] ist das Ding, das die Anfrage an den API-Server stellt. Handelt es sich wirklich um eine echte Instanz der mobilen App, oder handelt es sich um einen Bot, ein automatisiertes Skript oder einen Angreifer, der mithilfe eines Tools wie Postman manuell auf dem API-Server herumstochert?

Zu Ihrer Überraschung werden Sie möglicherweise feststellen, dass es sich um einen der legitimen Benutzer handeln kann, der eine neu gepackte Version der mobilen App oder ein automatisiertes Skript verwendet, das versucht, den von der Anwendung bereitgestellten Service zu nutzen und zu spielen.

Nun, um die [~ # ~] zu identifizieren, [~ # ~] , greifen Entwickler in der Regel auf einen API-Schlüssel zurück, in den sie normalerweise hart codieren den Code ihrer mobilen App. Einige Entwickler gehen die Extrameile und berechnen den Schlüssel zur Laufzeit in der mobilen App. Dadurch wird er zu einem Laufzeitgeheimnis im Gegensatz zum vorherigen Ansatz, wenn ein statisches Geheimnis in den Code eingebettet ist.

Die obige Beschreibung stammt aus einem Artikel mit dem Titel WARUM BRAUCHT IHRE MOBILE APP EINEN API-SCHLÜSSEL?, den Sie hier vollständig lesen können , das ist der erste Artikel in einer Reihe von Artikeln über API-Schlüssel.

Speichern sensibler Daten auf dem Client-Gerät

Und ich kann den Benutzernamen/das Passwort aus Sicherheitsgründen nicht im Gerät speichern? Sollte ich für jeden Benutzer bei der Anmeldung eine GUID ausgeben, diese auf seinem Gerät speichern und jedes Mal während einer API-Anforderung abrufen?

Alles, was Sie auf dem Gerät speichern, auch wenn es verschlüsselt ist, kann zur Laufzeit mit Tools wie Frida oder Xposed rückentwickelt werden.

Frida

Injizieren Sie Ihre eigenen Skripte in Black-Box-Prozesse. Haken Sie eine Funktion ein, spionieren Sie Krypto-APIs aus oder verfolgen Sie privaten Anwendungscode, kein Quellcode erforderlich. Bearbeiten, speichern und sofort die Ergebnisse sehen. Alles ohne Kompilierungsschritte oder Programmneustarts.

xPosed

Xposed ist ein Framework für Module, die das Verhalten des Systems und der Apps ändern können, ohne APKs zu berühren. Das ist großartig, denn es bedeutet, dass Module für verschiedene Versionen und sogar ROMs ohne Änderungen funktionieren können (solange der ursprüngliche Code vorhanden ist)

In einem Gerät, das der Angreifer kontrolliert, kann er auch einen Proxy verwenden, um einen Man in the Middle Attack durchzuführen, um ein Geheimnis zu extrahieren, mit dem Sie das [~ # ~] identifizieren können, was [~ # ~] oder die [~ # ~] die [~ # ~] wie ich im Artikel Stiehl diesen API-Schlüssel mit einem Mann im Angriff :

Während wir fortschrittliche Techniken wie JNI/NDK verwenden können, um den API-Schlüssel im Code der mobilen App zu verbergen, wird dies niemanden daran hindern, einen MitM-Angriff durchzuführen, um den API-Schlüssel zu stehlen. Tatsächlich ist ein MitM-Angriff so einfach, dass er sogar von Nicht-Entwicklern ausgeführt werden kann.

Was nun? Bin ich so zum Scheitern verurteilt, dass ich meinen API-Server nicht mehr vor Missbrauch schützen kann? Keine Ruhe also ... es gibt noch Hoffnung !!!

Mögliche Lösungen

Kann mir jemand sagen, welche Methode berühmte Android Anwendungen wie Facebook, FourSquare oder Twitter verwenden, um jede Anfrage von ihrer mobilen Anwendung an ihren Server zu authentifizieren?

Tut mir leid, aber ich habe nicht genug Wissen über diese Apps, um Sie zu erläutern, aber ich kann Sie auf einige andere Ansätze hinweisen.

Welche anderen Muster verfügbar sind und welche am effizientesten und sichersten sind, dafür brauche ich nur einen Prozessablauf.

Alles, was auf der Client-Seite ausgeführt wird und Geheimnisse für den Zugriff auf eine API benötigt, kann auf unterschiedliche Weise missbraucht werden. Weitere Informationen zu dieser Artikelserie über Sicherheitstechniken für mobile APIs finden Sie hier. In diesem Artikel erfahren Sie, wie API-Schlüssel, Benutzerzugriffstoken, HMAC und TLS-Pinning zum Schutz der API verwendet werden können und wie sie umgangen werden können.

Um das Problem von [~ # ~], was [~ # ~] auf Ihre mobile App zugreift, zu lösen, müssen Sie eine oder alle der in genannten Lösungen verwenden In der Reihe der Artikel über mobile API-Sicherheitstechniken, die ich oben erwähnt und akzeptiert habe, ist es nur schwierig, den unbefugten Zugriff auf Ihren API-Server zu umgehen, aber nicht unmöglich.

Eine bessere Lösung kann durch die Verwendung einer Mobile App Attestation-Lösung verwendet werden, mit der der API-Server weiß, dass nur Anforderungen von einer echten mobilen App empfangen werden.

Mobile App-Bestätigung

Durch die Verwendung einer Mobile App Attestation-Lösung kann der API-Server erkennen , [~ # ~] was [~ # ~] die Anforderungen sendet Ermöglichen, nur auf Anfragen von einer echten mobilen App zu antworten, während alle anderen Anfragen von unsicheren Quellen abgelehnt werden.

Die Aufgabe einer Mobile App Attestation-Lösung besteht darin, zur Laufzeit sicherzustellen, dass Ihre mobile App nicht manipuliert wurde, nicht auf einem gerooteten Gerät ausgeführt wird, nicht von einem Framework wie xPosed oder Frida instrumentiert wird und nicht von MitM angegriffen wird wird durch Ausführen eines SDK im Hintergrund erreicht. Der in der Cloud ausgeführte Dienst fordert die App heraus und bestätigt anhand der Antworten die Integrität der mobilen App und des Geräts, auf dem sie ausgeführt wird. Daher ist das SDK niemals für Entscheidungen verantwortlich.

Bei erfolgreicher Bestätigung der Integrität der mobilen App wird ein kurzzeitiges JWT-Token ausgegeben und mit einem Geheimnis signiert, das nur dem API-Server und dem Mobile App Attestation-Dienst in der Cloud bekannt ist. Bei einem Fehler in der Bestätigung der mobilen App wird das JWT-Token mit einem Geheimnis signiert, das der API-Server nicht kennt.

Jetzt muss die App bei jedem API-Aufruf das JWT-Token in den Headern der Anfrage senden. Auf diese Weise kann der API-Server nur Anforderungen bedienen, wenn er die Signatur und die Ablaufzeit im JWT-Token überprüfen und ablehnen kann, wenn die Überprüfung fehlschlägt.

Wenn das vom Mobile App Attestation-Dienst verwendete Geheimnis der mobilen App nicht bekannt ist, kann es zur Laufzeit nicht rückentwickelt werden, selbst wenn die App manipuliert wird, auf einem verwurzelten Gerät ausgeführt wird oder über eine Verbindung kommuniziert, die die ist Ziel eines Mannes im mittleren Angriff.

Der Mobile App Attestation-Dienst existiert bereits als SAAS-Lösung bei Approov (ich arbeite hier) und bietet SDKs für mehrere Plattformen, einschließlich iOS, Android, React Native und andere. Die Integration erfordert auch eine kleine Überprüfung des API-Servercodes, um das vom Cloud-Service ausgegebene JWT-Token zu überprüfen. Diese Überprüfung ist erforderlich, damit der API-Server entscheiden kann, welche Anforderungen zu bedienen und welche abzulehnen sind.

Fazit

Letztendlich muss die zum Schutz Ihres API-Servers zu verwendende Lösung in Übereinstimmung mit dem Wert des zu schützenden Objekts und den gesetzlichen Anforderungen für diese Art von Daten ausgewählt werden, wie z. B. den GDPR-Bestimmungen in Europa.

MÖCHTEN SIE DIE EXTRA MILE GEHEN?

OWASP Mobile Security Project - Die 10 größten Risiken

Das OWASP Mobile Security Project ist eine zentralisierte Ressource, die Entwicklern und Sicherheitsteams die Ressourcen zur Verfügung stellt, die sie zum Erstellen und Verwalten sicherer mobiler Anwendungen benötigen. Im Rahmen des Projekts ist es unser Ziel, mobile Sicherheitsrisiken zu klassifizieren und Entwicklungskontrollen bereitzustellen, um deren Auswirkungen oder die Wahrscheinlichkeit einer Ausbeutung zu verringern.

0
Exadra37