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.