Frage

Hintergrund:

Ich bin der Gestaltung des Authentifizierungsschema für einen Web-Service-REST. Dies gilt nicht „wirklich“ muß sicher sein (es eher ein persönliches Projekt ist), aber ich mag es wie möglich als eine Übung / Lernerfahrung als sicherer machen. Ich möchte nicht, SSL verwenden, da ich den Streit nicht will, und, vor allem, um die Kosten es der Einrichtung.

Diese SO Fragen waren besonders nützlich für mich loszulegen:

Ich denke, eine vereinfachte Version von Amazon S3 Authentifizierungs (Ich mag OAuth aber es scheint zu kompliziert für meine Bedürfnisse). Ich füge einen zufällig generierte nonce , vom Server bereitgestellt, auf die Anfrage zu verhindern Replay Angriffe.

Um auf die Frage:

Sowohl S3 und OAuth verlassen, um die Anfrage-URL zusammen mit ein paar ausgewählten Header bei der Unterzeichnung. Keiner von ihnen unterschreiben den Antrag Körper für POST oder Anfragen PUT. Ist das nicht anfällig für einen Man-in-the-Middle-Angriff, der die URL und Header und ersetzt die Anforderung Körper mit beliebigen Daten hält der Angreifer will?

Es scheint, wie ich gegen diese, indem ein Hash-Wert des Anforderungstext in der Zeichenfolge schützen kann, die signiert wird. Ist das sicher?

War es hilfreich?

Lösung

Eine vorherige Antwort nur SSL erwähnte im Zusammenhang mit der Datenübertragung und eigentlich nicht decken Authentifizierung.

Sie fragen wirklich sicher REST-API-Clients zu authentifizieren. Es sei denn, Sie TLS-Client-Authentifizierung verwenden, SSL allein ist kein gangbarer Authentifizierungs-Mechanismus für ein REST-API. SSL ohne Client authc authentifiziert nur die Server , die für die meisten REST-APIs irrelevant ist, weil Sie wirklich die Client authentifizieren möchten.

Wenn Sie nicht TLS-Client-Authentifizierung verwenden, müssen Sie so etwas wie ein Digest-basiertes Authentifizierungsschema verwenden (wie Amazon Web Service des benutzerdefinierten Schema) oder OAuth 1.0a oder auch HTTP-Basic-Authentifizierung (aber über SSL nur) .

authentifizieren Diese Regelungen, dass die Anforderung gesendet wurde von jemandem erwartet. TLS (SSL) (ohne die Client-Authentifizierung) stellt sicher, dass die Daten über den Draht bleibt gesendet untampered. Sie sind getrennt - aber sich ergänzende - Bedenken

.

Für Interessenten, ich habe auf eine Frage SO erweitert über HTTP Authentication Schemes und wie sie funktionieren .

Andere Tipps

REST bedeutet mit den Standards des Web zu arbeiten, und der Standard für „sichere“ Übertragung im Netz ist SSL. Alles andere wird für Kunden Art von funky und erfordern zusätzliche Installationsaufwand sein, die müssen Verschlüsselungsbibliotheken zur Verfügung haben.

Wenn Sie SSL begehen, gibt es wirklich Lust nichts erforderlich für die Authentifizierung im Prinzip. Sie können wieder mit Web-Standards gehen und verwenden HTTP Basic Auth (Benutzername und geheim mit jeder Anforderung gesendet Token zusammen), wie es ist viel einfacher, als ein ausgeklügeltes Unterzeichnung Protokoll, und immer noch wirksam im Zusammenhang mit einer sicheren Verbindung. Sie müssen nur das Passwort sicher sein nie Klartext geht über; so, wenn das Passwort jemals über eine Klartext-Verbindung empfangen wird, könnten Sie sogar das Passwort deaktivieren und den Entwickler schicken. Sie sollten auch die Anmeldeinformationen gewährleisten sind nicht überall auf den Empfang angemeldet, so wie man es kein reguläres Passwort einloggen.

HTTP Digest ist ein sicherer Ansatz, da sie die geheimen Token verhindert entlang geführt werden; Stattdessen ist es ein Hash des Server am anderen Ende überprüfen. Obwohl es für weniger empfindliche Anwendungen zu viel des Guten, wenn Sie die Vorsichtsmaßnahmen oben genannten genommen haben. Immerhin das Kennwort des Benutzers bereits in Klartext übertragen wird, wenn sie sich anmelden (es sei denn, Sie einige ausgefallene JavaScript-Verschlüsselung im Browser tun) und ebenfalls ihre Cookies auf jede Anfrage.

Beachten Sie, dass mit APIs, ist es besser für den Kunden vorbei Token zu sein - zufällig generierten Strings - anstelle des Kennworts die Entwickler an der Website anmeldet mit. So soll der Entwickler in der Lage sein, in Ihrer Website einloggen und neue Token zu generieren, die für die API-Überprüfung verwendet werden können.

Der Hauptgrund, ein Token zu verwenden, ist, dass es ersetzt werden kann, wenn es gefährdet ist, während, wenn das Passwort kompromittiert wird, kann der Besitzer auf das Konto des Entwickler anmelden und mit ihm alles, was sie wollen tun. Ein weiterer Vorteil des Tokens ist, dass Sie mehrere Token auf die gleichen Entwickler ausgeben kann. Vielleicht, weil sie mehrere Anwendungen haben oder weil sie wollen Token mit verschiedenen Zugriffsebenen.

(Stand Auswirkungen zu decken zur Herstellung der Verbindung SSL-only).

Oder Sie könnten die bekannte Lösung für dieses Problem und die Verwendung von SSL verwenden. Selbst signierte Zertifikate sind frei, und es ist ein persönliches Projekt nicht wahr?

Wenn Sie den Hash-Wert des Körpers als einer der Parameter in der URL benötigen und diese URL wird über einen privaten Schlüssel signiert, dann einem Mann-in-the-Middle-Angriff wäre nur in der Lage sein, den Körper mit Inhalt zu ersetzen, würde den gleichen Hash erzeugen. Einfach mit MD5-Hash-Werten zu tun jetzt zumindest, und wenn SHA-1 gebrochen ist, na ja, Sie erhalten das Bild.

, um den Körper sichern vor Manipulation, würden Sie eine Signatur des Körpers erfordern müssen, die ein Mann-in-the-Middle-Angriff weniger wahrscheinlich zu brechen in der Lage sein würde, da sie nicht die privaten Schlüssel kennen würden, die erzeugt die Unterschrift.

In der Tat, die ursprüngliche S3 Auth hat für den Inhalt erlaubt unterzeichnet werden, wenn auch mit einer schwachen MD5-Signatur. Sie können einfach ihre optionale Praxis einschließlich eines Content-MD5-Header in der HMAC erzwingen (string unterzeichnet werden).

http://s3.amazonaws.com/doc/s3- Entwickler-guide / RESTAuthentication.html

Das neue v4 Authentifizierungsschema ist sicherer.

http: //docs.aws.amazon. com / general / latest / gr / Signatur-Version-4.html

Beachten Sie, dass Ihre Vorschläge es für die Kunden schwierig macht, mit dem Server zu kommunizieren. Sie benötigen eine innovative Lösung zu verstehen und die Daten entsprechend zu verschlüsseln, ist dieses Modell für die öffentliche API nicht so gut ist (es sei denn, Sie amazon \ yahoo \ Google sind ..).

Wie auch immer, wenn Sie den Körper Inhalt verschlüsseln, muss ich Ihnen Standards und Lösungen zu überprüfen, würde vorschlagen, bestehende wie:

XML-Verschlüsselung (W3C-Standard)

XML Sicherheit

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top