Was sind die Best Practices zum Sichern einer Web-API?

15

Ich muss eine Webservice-API für unsere mobile App erstellen, um mit unserem Server und unserer Datenbank zu interagieren (in ASP.Net MVC 4, aber das ist kaum relevant). Da für die meisten Aktionen keine Benutzer bei unserem Dienst registriert sein müssen, möchten wir den Zugriff nur auf Benutzer unserer App beschränken.

Mit welchen Methoden können Sie sicherstellen, dass Anrufe von einem anderen Ort (z. B. von jemandem, der alle unsere Daten möchte oder eine inoffizielle App erstellt) abgelehnt werden?

Meine ursprüngliche Idee ist, dass das Gerät den Server nach einem Token fragt, das zufällig generiert und unverändert gesendet wird. Bei allen anderen Methoden wird überprüft, ob die Anforderungsheader einen bestimmten enthalten, bei dem es sich um md5-Hash des gesalzenen Tokens handelt. Der Server kennt das Token und Salt und kann den Hash berechnen und mit dem gesendeten vergleichen. Darüber hinaus hat das Token eine begrenzte Lebensdauer und das Gerät muss jede zweite Stunde ein neues erhalten.

Das scheint recht einfach zu implementieren und obwohl es wahrscheinlich kein 100% iger Beweis ist, scheint dies eine gute Idee zu sein. Was denkst du?

Antoine
quelle

Antworten:

15

Sobald Sie die Anwendung freigeben, wird sie möglicherweise zurückentwickelt. Dies bedeutet, dass Sie nichts tun können, um 100% geschützt zu sein, wenn dieselbe Anwendung (dieselben Binärdateien, dieselben Einstellungen) an alle Benutzer verteilt wird.

Wenn Sie die Anwendung für jeden Benutzer anpassen können, besteht die Möglichkeit, dass Sie einer anderen Anwendung die Verwendung der API möglicherweise nicht untersagen, diese Anwendung jedoch zumindest durch die Anzahl der Anforderungen einschränken, die sie an die API stellen kann.

Stellen Sie sich folgendes Schema vor:

  1. Der Client stellt eine Verbindung her und sendet seine eindeutige Kennung (eine Kennung pro Benutzer).
  2. Der Server antwortet, indem er eine mit einem öffentlichen Schlüssel verschlüsselte Abfrage sendet. Dieser öffentliche Schlüssel ist dem zuvor gesendeten eindeutigen Bezeichner zugeordnet.
  3. Der Client löst die Herausforderung, indem er die Daten mit einem privaten Schlüssel entschlüsselt und das entschlüsselte Geheimnis unverschlüsselt an den Server zurücksendet.
  4. Der Server überprüft, ob das übermittelte Geheimnis dem ursprünglich generierten Geheimnis entspricht.

Der Entwickler, der Ihre Anwendung hackt und den privaten Schlüssel erfolgreich erhält, kann Ihre API aus seiner eigenen Anwendung verwenden, wird jedoch als sich selbst für Ihren Server identifiziert.

Wenn derselbe Benutzer 10 000 Anfragen pro Tag an Ihre API stellen kann und ein aktiver Benutzer durchschnittlich 2 000 Anfragen pro Tag stellt, bedeutet dies, dass dieser Entwickler seine Anwendung selbst verwenden und sie möglicherweise an seine Freunde weitergeben kann, aber er könnte es beispielsweise nicht an Tausende von Menschen verkaufen, nur weil es morgens nur für ein paar Minuten funktioniert.

Dies ist zwar hilfreich, aber auch kein 100% iger Beweis. Was ist, wenn der Hacker eine Möglichkeit findet, den privaten Schlüssel aus Ihrer App zu extrahieren, wenn seine eigene App auf dem Gerät installiert ist?


Randnotiz, die Ihre Frage nicht beantwortet, aber dennoch nützlich sein könnte: Denken Sie nicht an eine API als Werkzeug für Ihr Primärprodukt (mobile Anwendung). Betrachten Sie es als ein erstklassiges Produkt , ein Produkt, das bezahlt werden kann. Dasselbe Modell wird seit Jahren von Amazon und Google verwendet, es wird ab sofort von Microsoft mit Azure usw. aktiv verwendet.

Sobald Sie die API nicht als sekundäres Tool betrachten, das für Ihre glänzenden neuen mobilen Apps zur Sklaverei geworden ist, sondern als das eigentliche Produkt, und zwar auf derselben Ebene wie jede Anwendung, die der Benutzer tatsächlich sieht, denken Sie weniger darüber nach, wie Sie die API schützen können die Nutzung durch andere Apps und mehr über die Monetarisierung der API selbst. Eine solche API kann von Ihren Apps, bei denen es sich um Kunden handelt, oder von anderen Apps verwendet werden, die von jedem frei entwickelt wurden. Dies hat mehrere Vorteile:

  • Es ist schwierig und teuer, eine API so zu gestalten, dass sie nur von Ihren Anwendungen verwendet wird. Diese Zeit und das Geld können für etwas Nützlicheres verwendet werden.

  • Das Öffnen Ihrer API für die Öffentlichkeit kann sowohl für Sie als auch für die Welt von großem Nutzen sein. Stellen Sie sich vor, Sie sind ein großartiger Architekt und ein großartiger Entwickler, also haben Sie eine erstaunlich gute API erstellt, aber Ihre visuellen Designerfähigkeiten sind nicht gut und Sie verstehen wirklich nichts über Interaktionsdesign usw. Wenn Sie Ihre API verbergen, ist dies die einzige Die Leute werden wissen, dass Sie eine mobile Anwendung erstellt haben, die unbrauchbar und hässlich ist. Wenn Ihre API öffentlich ist, werden andere Entwickler von ihrer Qualität angezogen sein und großartige Anwendungen dafür schreiben, was Ihnen viel Geld einbringt.

  • Sie können sich nie vorstellen, wie andere Benutzer Ihre APIs verwenden könnten. Dies ist, was mit Kinect passiert ist. Microsoft hat Kinect ursprünglich für Spiele entwickelt. Als Microsoft die API für die Öffentlichkeit öffnete, hatten sie nie gedacht, dass sie einige Jahre später von wissenschaftlichen Anwendungen, dem Gesundheitssektor usw. verwendet werden würde. Ähnliches gilt für Web-APIs: Je mehr Entwickler sie verwenden, desto weiter verbreitet sind die Ideen.

Arseni Mourzenko
quelle
Sehr interessante Antwort. Wir müssen uns wahrscheinlich überlegen, wie wir die API veröffentlichen können. Als Referenz dient auch der Zielmarkt in Frankreich, in dem Reverse Engineering und Disassemblierung illegal sind. Wir sollten uns daher zu sehr damit beschäftigen.
Antoine
2
@ Antoine: Revere Engineering wäre in jedem Land illegal, sobald die Lizenz dies verbietet. Die Tatsache, dass es illegal ist, bedeutet jedoch nicht, dass niemand Ihre App als Entwickler verehren wird.
Arseni Mourzenko