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:
- Benutzer werden anonym beim Dienst angemeldet, ohne dass ein Benutzer ein Kennwort benötigt
- Der WS muss vollständig zustandslos sein, um eine horizontale Skalierung zu ermöglichen
- Wir stellen eine Verbindung über HTTPS (SSL) her, um das Snooping von Drittanbietern zu verhindern
BEARBEITEN:
- Wir richten uns an native iOS / Android-Geräte
- Unser Hauptanliegen ist es sicherzustellen, dass nur nicht manipulierte Kunden Anfragen senden können
Und der abstrakte Authentifizierungsprozess:
- 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).
- Der Client sendet seine UDID, seinen Zeitstempel und seinen Hash an den Server
- Der Server erstellt den Hash neu und entschlüsselt den vom Benutzer gesendeten verschlüsselten Hash
- 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.
Antworten:
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.
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.
quelle
Der Schlüssel zu REST ist, dass Sie die inhärenten Funktionen von http verwenden:
Einige der anderen Richtlinien sind, dass Ihre URLs intuitiv sein sollten, dh wenn Ihre URL für Spieler
http://example.com/api/player
eine sinnvolle Möglichkeit ist, ihre letzte Historie von Punktzahlen offenzulegen, könnte dies seinhttp://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.
quelle