Mobile-zu-Server-API-Sicherheit

8

Ich habe die Aufgabe, ein System zu entwickeln, das es unseren Nutzern ermöglicht, sich auch in ihren Konten anzumelden und mit ihren Mobiltelefonen mit unserem Dienst zu interagieren. Ich bin jedoch besorgt über die Sicherheit der Anwendung.

Grundsätzlich erlauben wir es Leuten, sich über OAuth mit Facebook oder Twitter anzumelden. Die mobile Anwendung (mit Appcelerator Titan gebaut) sollte das auch tun. Nach einer erfolgreichen Anmeldung am Telefon muss ich meiner App mitteilen, dass sich jemand mit FB oder Twitter angemeldet hat, damit meine App die anwendungsspezifische Benutzer-ID des Nutzers abrufen kann.

Mein erster Gedanke war, eine API zu schreiben, die das Telefon aufrufen könnte, um Parameter wie Facebook oder twitter userId zu akzeptieren. Ich würde meine Datenbank abfragen und ihre interne Benutzeridentifikation finden und sie zum Telefon zurückbringen.

Das würde gut funktionieren, aber es ist völlig unsicher. Jeder könnte dieselbe API mit einer Facebook-Nutzer-ID aufrufen und die API würde nur die interne ID (und alle anderen von der App benötigten Daten) zurückgeben, ohne zu wissen, ob die Anfrage autorisiert ist.

Dies ist meine erste mobile App, daher bin ich mir nicht ganz sicher, wie ich die Sicherheit auf meiner API richtig implementieren kann.

    
Bryan Migliorisi 22.04.2011, 19:58
quelle

3 Antworten

2
  1. Wenn Sie können, verwenden Sie https, und viele Probleme gelöst.
  2. Wenn Sie sich erfolgreich angemeldet haben, können Sie eine Sitzung erstellen und Sitzungs-ID an den Client übergeben, hier rate ich Ihnen dazu sende die sessionid mit RSA way (für den fall, dass jemand deine sessionid schnüffeln kann)
  3. Verwenden Sie eine Hash-Signatur, um sicherzustellen, dass die Anfrage nicht auf dem Weg geändert wird, aber diese Methode kann nicht verhindern, dass das Problem erneut auftritt.

Schließlich, für Ihr Problem, wenn es neue Fortschritte gibt, lassen Sie es mich bitte wissen, danke!

    
jianpx 04.04.2012 13:37
quelle
2

Ich bin auch auf dieses Problem gestoßen, die Authentifizierung des Benutzers ist unkompliziert, aber das Authentifizieren des Geräts ist viel schwieriger. Wie du gesagt hast, jeder kann sich mit deiner API verbinden und einen über Facebook authentifizierten Nutzer präsentieren und auf deine API zugreifen.

Sie können mit der gegenseitigen SSL-Authentifizierung umgehen, aber wenn der Schlüssel auf einem einzelnen mobilen Gerät kompromittiert ist, ist die gesamte API kompromittiert, da alle Geräte das gleiche Schlüsselpaar verwenden würden wie die App bei der Installation.

Was ich letztendlich getan habe, war, dass das Gerät sich bei der ersten Installation der App bei meiner API registrieren musste. Das Gerät macht einen API-Aufruf an meinen Server und es wird ein API-Schlüsselgeheimnis ausgegeben, das dann verwendet werden muss, um alle anderen API-Aufrufe durchzuführen. Dies ist nicht sicher, da Sie ein Skript schreiben könnten, um sich selbst zu registrieren und einen API-Schlüssel zu erhalten, aber es erlaubt mir, API-Nutzung zu überwachen und Geräte, die sich schlecht verhalten, auszuschalten.

Das ist das Beste, was ich mir vorstellen kann, eine Möglichkeit, nicht autorisierte Geräte, die ich out-of-band identifiziert habe, auszuschließen.

    
chad 14.08.2012 18:33
quelle
0

Ich hatte das gleiche Problem und habe es gelöst, indem ich meine eigene API (PHP) in Kombination mit einem Proxy-Server (NodeJS) erstellt habe. Jede Anfrage von meinem Client wird an den Proxy-Server gesendet, der Proxy-Server validiert die Anfrage und übergibt sie an meine API. Die API erlaubt nur Anfragen vom Proxy-Server seine IP.

Zuerst authentifiziert sich der Benutzer mit dem Proxy-Server, indem er den Authorization-Header verwendet. Wenn der Benutzer Erfolg hat, erhält er 2 Token. Ein Zugriffstoken und ein Aktualisierungstoken. Das Zugriffs-Token wird verwendet, um in meinem Fall 5 Minuten lang Anfragen zu stellen und zu leben. Wenn das Zugriffstoken abgelaufen ist, kann der Benutzer das Token mit dem Aktualisierungs-Token aktualisieren, das für immer existiert.

Erstellen Sie in Ihrer App ein globales Modul, das Ihre Schlüssellogik verarbeitet, Ihre Schlüssel in Ihren lokalen Eigenschaften speichert und sie verwendet, wenn der Benutzer die App neu startet, sodass sie sich nicht jedes Mal erneut anmelden müssen.

Wenn Sie dies mit HTTPS verwenden, können die Schlüssel nicht erkannt werden und Sie können die Schlüssel nicht abrufen, wenn Sie die App dekompilieren, da sie auf dem Benutzergerät gespeichert und nicht in der App "fest codiert" sind. Wenn der Angreifer über das Gerät des Benutzers verfügt, kann er die App technisch dekompilieren und die Schlüssel abrufen. Ich weiß das, aber wenn er bereits Zugriff auf das physische Gerät hat, könnte er sowieso jede App benutzen.

Der Proxy-Server protokolliert auch jede eingehende Anfrage und benachrichtigt mich per E-Mail, wenn jemand Tricks versucht (ich habe das selbst erstellt). Ich habe folgende Module benutzt:

  • ausdrücken
  • Ссылка
  • Ссылка
  • jsonwebtoken (generiert und validiert Zugriffs- / Aktualisierungstoken)
Garre 21.04.2017 07:49
quelle