Sichern eines Webdienstes, damit er nur von einer bestimmten Android-Anwendung aufgerufen werden kann

8

Wir haben einen Webdienst, der nur von einer bestimmten Android App aufgerufen werden sollte. Welche Lösungen gibt es für dieses Problem?

Die Anforderung besteht darin, keine Authentifizierung zu verwenden.

    
pyeleven 24.02.2012, 13:48
quelle

3 Antworten

7

Wenn es nur Ihr Client und Ihr Server ist, können (und sollten) Sie SSL verwenden, ohne etwas zu kaufen. Sie kontrollieren den Server und den Client, also sollte jeder nur einem Zertifikat vertrauen, das dem anderen gehört und Sie brauchen keine CAs für diesen Zweck.

Hier ist der Ansatz auf hoher Ebene. Erstellen Sie ein selbstsigniertes Server-SSL-Zertifikat und stellen Sie es auf Ihrem Webserver bereit. Sie können das Keytool verwenden, das zu diesem Zweck im Android SDK enthalten ist. Erstellen Sie dann einen selbstsignierten Client und stellen Sie ihn in Ihrer Anwendung in einem benutzerdefinierten Keystore bereit, der in Ihrer Anwendung als Ressource enthalten ist (keytool generiert dies ebenfalls). Konfigurieren Sie den Server so, dass eine clientseitige SSL-Authentifizierung erforderlich ist, und akzeptieren Sie nur das von Ihnen generierte Clientzertifikat. Konfigurieren Sie den Client so, dass er das clientseitige Zertifikat verwendet, um sich zu identifizieren, und akzeptieren Sie nur das eine serverseitige Zertifikat, das Sie für diesen Teil auf dem Server installiert haben.

Schritt für Schritt ist das eine viel längere Antwort als hier geboten. Ich würde vorschlagen, dies in Etappen zu tun, da es im Internet Ressourcen gibt, wie man mit dem selbstsignierten SSL-Zertifikat in Android sowohl auf der Server- als auch auf der Clientseite umgehen kann. Es gibt auch einen vollständigen Durchlauf in meinem Buch, Application Security für die Android-Plattform , veröffentlicht von O'Reilly .

Normalerweise speichern Sie dieses Zertifikat / diesen privaten Schlüssel in einem Keystore von someype (einem KeyStore, wenn Sie Android verwenden), und dieser Keystore wird verschlüsselt. Diese Verschlüsselung basiert auf einem Passwort. Sie müssen entweder (1) dieses Passwort irgendwo in Ihrem Client speichern oder (2) den Benutzer nach dem Passwort fragen, wenn sie Ihre Client-App starten. Was Sie tun müssen, hängt von Ihrem Anwendungsfall ab. Wenn (2) akzeptabel ist, haben Sie Ihre Anmeldeinformationen gegen Reverse Engineering geschützt, da sie verschlüsselt werden und das Passwort nirgendwo gespeichert wird (aber der Benutzer muss es jedes Mal eingeben). Wenn Sie dies tun (1), kann jemand Ihren Client zurückentwickeln, das Kennwort abrufen, den Keystore abrufen, den privaten Schlüssel und das Zertifikat entschlüsseln und einen anderen Client erstellen, der eine Verbindung zum Server herstellen kann.

>

Sie können nichts dagegen tun; Sie können Ihren Code reverse engineeren (durch Verschleierung usw.), aber Sie können es nicht unmöglich machen. Sie müssen bestimmen, was das Risiko, das Sie mit diesen Ansätzen zu mindern versuchen, ist und wie viel Arbeit es wert ist, es zu mildern.

    
jeffsix 24.02.2012, 14:57
quelle
1

Ich denke, das wird mit der richtigen Authentifizierung an Ort und Stelle funktionieren. Der erste Post, über den ich gerade gestolpert bin, war dieser: Absichern der Kommunikation von android zu einem Webservice Hoffe es hilft =)

    
Matze 24.02.2012 13:52
quelle
1

Wenn Sie absolut sicher sind, dass auf diesen Webdienst nur von autorisierten Anwendungen / Geräten zugegriffen werden muss, gehen Sie mit clientseitigen SSL-Zertifikaten vor und beschränken Sie den Zugriff auf dem Server auf Clients mit autorisierten Zertifikaten. Dies hat die Bonus-Funktion, SSL immer zu erzwingen, sodass Sie Authentifizierungsgeheimnisse über einen offenen Kanal nicht mögen. Hier ist eine Kurzanleitung für Apache, aber Sie könnten auch nginx verwenden:

Ссылка

    
Jason Lewis 24.02.2012 13:55
quelle

Tags und Links