Ist diese Lösung RESTful und sicher?


8

Unser Produkt registriert neue Player in unserem Service und wir haben uns dafür entschieden, es auf Azure zu hosten (wir verwenden .NET). Wir wollten, dass es zustandslos (aus Gründen der Skalierbarkeit) und relativ sicher ist.

Da dies das erste REST WS ist, das ich schreibe, wollte ich ein Feedback dazu bekommen, ob es eine solide Lösung ist oder nicht.

Einige Vermutungen, die Sie über unsere App wissen sollten:

  1. Benutzer werden anonym beim Dienst angemeldet, ohne dass ein Benutzer ein Kennwort benötigt
  2. Der WS muss vollständig zustandslos sein, um eine horizontale Skalierung zu ermöglichen
  3. Wir stellen eine Verbindung über HTTPS (SSL) her, um das Snooping von Drittanbietern zu verhindern

BEARBEITEN:

  1. Wir richten uns an native iOS / Android-Geräte
  2. Unser Hauptanliegen ist es sicherzustellen, dass nur nicht manipulierte Kunden Anfragen senden können

Und der abstrakte Authentifizierungsprozess:

  1. Der Client erstellt einen einfachen Hash (UDID: Timestamp) und verschlüsselt ihn mithilfe des Zeitstempels mit einem grundlegenden Algorithmus (z. B. ist der geheime Schlüssel jedes zweite Zeichen aus dem Hash).
  2. Der Client sendet seine UDID, seinen Zeitstempel und seinen Hash an den Server
  3. Der Server erstellt den Hash neu und entschlüsselt den vom Benutzer gesendeten verschlüsselten Hash
  4. Wenn beide gleich sind, wissen wir, dass es tatsächlich von unserem Kunden gesendet wurde (und hoffentlich nicht von einem böswilligen Absender).

Alle Eingaben / Vorschläge wären großartig - da ich dieses Problem zum ersten Mal behandle, habe ich es möglicherweise falsch entworfen.

Vielen Dank!

2. Update:

Beim Lesen der Sicherheitsspezifikationen für OAuth scheint es keine wirkliche Antwort auf meine Frage zu geben - da der Client und der Server die geheimen Schlüssel kennen müssen und der Client lokal auf den Mobilgeräten unserer Benutzer gespeichert ist (im Gegensatz zu einer Web-App).

Aus dem OAuth-Sicherheitshandbuch ( http://hueniverse.com/oauth/guide/security/ ):

Bei der Implementierung von OAuth ist es wichtig, die Einschränkungen gemeinsamer Geheimnisse zu verstehen, symmetrisch oder asymmetrisch. Das Client-Geheimnis (oder der private Schlüssel) wird verwendet, um die Identität des Clients durch den Server zu überprüfen. Bei einem webbasierten Client wie einem Webserver ist es relativ einfach, den Client geheim (oder den privaten Schlüssel) vertraulich zu behandeln.

Wenn es sich bei dem Client jedoch um eine Desktopanwendung, eine mobile Anwendung oder eine andere clientseitige Software wie Browser-Applets (Flash, Java, Silverlight) und Skripts (JavaScript) handelt, müssen die Client-Anmeldeinformationen in jeder Kopie der Anwendung enthalten sein . Dies bedeutet, dass das Client-Geheimnis (oder der private Schlüssel) mit der Anwendung verteilt werden muss, wodurch diese von Natur aus gefährdet werden.

Dies verhindert nicht die Verwendung von OAuth in einer solchen Anwendung, begrenzt jedoch das Vertrauen, das der Server in solche öffentlichen Geheimnisse haben kann. Da den Geheimnissen nicht vertraut werden kann, muss der Server diese Anwendung als unbekannte Entitäten behandeln und die Clientidentität nur für Aktivitäten verwenden, für die kein Vertrauensniveau erforderlich ist, z. B. das Sammeln von Statistiken über Anwendungen. Einige Server entscheiden sich möglicherweise dafür, eine solche Anwendung zu sperren oder andere Protokolle oder Erweiterungen anzubieten. Zu diesem Zeitpunkt ist jedoch keine Lösung für diese Einschränkung bekannt.


Warum nicht OAuth nehmen ?
Redreggae

Ist es möglich, OAuth mit .NET zu verwenden? Wie ich schon sagte, das erste Mal habe ich ein solches Problem angegangen - ich bin ein ruhiger Noob :)
Ron

@redreggae - Ich habe vergessen zu erwähnen, dass dies auf Mobilgeräten ohne Identifikation eines Drittanbieters (Facebook, Google usw.) implementiert wird
Ron

Können Sie den Authentifizierungsverschlüsselungsprozess erweitern? Wie es sich anhört, klingt es ziemlich unsicher. Welchen Verschlüsselungsalgorithmus verwenden Sie? Warum denken Sie, dass das Ableiten eines solchen Schlüssels sicher ist (es ist wirklich nicht)
Oleksi

1
@Oleksi - Ich bin mir dessen ziemlich bewusst, aber könnten Sie bitte etwas hilfreicher sein und vielleicht eine Lösung beantworten, die sicher (oder zumindest sicherer) ist?
Ron

Antworten:


3

Dies ist etwas tangential, aber aus Sicherheitsgründen ist jedes Geheimnis, das sich auf einem Client befindet, kein Geheimnis. Das geben Sie in Ihrer Frage an.

Unser Hauptanliegen ist es sicherzustellen, dass nur nicht manipulierte Kunden Anfragen senden können.

Als jemand, der in der Spielebranche gearbeitet hat, ist dies eine verlorene Sache. Wenn genügend Wert vorhanden ist, um beliebige Anforderungen senden zu können, finden Benutzer heraus, wie diese Anforderungen gesendet werden können. Sie können sich niemals darauf verlassen, dass Sie feststellen können, ob eine Anfrage von einem vertrauenswürdigen Client stammt. Hier sind einige Tipps aus meinen Erfahrungen.

  • Behalten Sie die kanonische Kopie des Spielstatus auf dem Server
  • Stellen Sie fest, welche Änderungen am Status jeder Benutzer vornehmen kann, und lassen Sie serverseitige Überprüfungen auf Verstöße durchführen.
  • Legen Sie fest, wie schnell Benutzer aufsteigen oder Geld / Gegenstände verdienen können, um Skripte abzufangen.
  • Wenn der Betrüger nicht trauern kann, verbieten andere Spieler sie nicht. Viele Betrüger geben auch Geld aus.
  • Haben Sie soziale Kontrolle über Betrüger, dh damit Betrüger für ihre Freunde offensichtlich werden. Wenn Sie eine passende Logik haben können, werden Betrüger vom Spielen gegen ihre Freunde ausgeschlossen.

0

Der Schlüssel zu REST ist, dass Sie die inhärenten Funktionen von http verwenden:

  • GET: zum einfachen Abrufen von Daten
  • POST: zum Einfügen eines neuen Datenpunktes
  • PUT: zum Aktualisieren eines Datenpunktes
  • LÖSCHEN: Zum Löschen eines Datenpunkts

Einige der anderen Richtlinien sind, dass Ihre URLs intuitiv sein sollten, dh wenn Ihre URL für Spieler http://example.com/api/playereine sinnvolle Möglichkeit ist, ihre letzte Historie von Punktzahlen offenzulegen, könnte dies sein http://example.com/api/player/1/scores(dh die Punktzahlen für Spieler-ID 1).

Was die Sicherheit betrifft, ist das, was Sie aus der OAuth-Spezifikation gelesen haben, sehr wahr. Wenn Sie einen privaten Schlüssel in eine Binärdatei einbetten, die andere Benutzer in die Hände bekommen können, können Sie nicht davon ausgehen, dass er vollständig privat ist. Ich würde vorschlagen, dass Sie, wenn Sie einen privaten Schlüssel in Ihrem Code haben, diesen so einrichten, dass Sie ihn ablaufen lassen können, und dann ein Update veröffentlichen, um ihn zu ändern. Nutzen Sie auf jeden Fall die Gelegenheit, um es mit Verschlüsselung und allem anderen zu schützen, aber machen Sie es einfach zu deaktivieren, wenn es gehackt wird. Die Realität ist, dass Twitter et al. Vor derselben Herausforderung stehen, bei der hin und wieder die geheimen Schlüssel für ihre offiziellen Apps entdeckt und im Internet veröffentlicht werden und sie ihre Apps aktualisieren müssen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.