2012-03-30 7 views
2

Wenn ich ein komplexes Objekt habe, das als API-Anforderung gesendet wurde (z. B. Auftrag unten), sollte ich alle Eigenschaften beim Generieren der Signatur angeben oder sollte ich nur eine Teilmenge verwenden?Was ist beim Signieren einer API-Anforderung zu berücksichtigen?

ich frage, weil ich nicht klar bin und in anderen API suchen ist die Anfragen Parameter sind flach und einfach

public class Order 
    { 
     public string Id { get; set; } 
     public string ClientIdentifier { get; set; } 
     public IEnumerable<OrderItems> OrderItems { get; set; } 
     public long timestamp { get; set; } 
     public string signature { get; set; } 
    } 

public class OrderItems 
{ 
    public string ItemId { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<decimal> PriceBands { get; set; }pes 
      more types 



} 

and so on .... 
+0

Irgendwelche Vorschläge? – Noel

+2

Was hat das mit OAuth zu tun? – naveen

Antwort

7

Sie müssen zuerst verstehen, was das Signieren der Nachricht verhindert zu verstehen, welche Daten in der Anfrage enthalten sein sollen. Hier ist eine Liste der 2 wichtigsten Dinge, die das Signieren der Anfragen Angreifer davon abhalten kann.

  1. Mit einer signierten Anforderung wird das Kennwort geschützt und ein Angreifer kann die Informationen in der Abfrage nicht verwenden, um eine andere Anforderung zu signieren. Dies ist hilfreich, wenn der Angreifer sehen kann, dass die Anfrage an den Server gesendet wird.
  2. Der Angreifer kann keine Daten in der Anforderung ändern, die zum Generieren der Signatur verwendet wurde, ohne die Signatur zu entwerten, wodurch die Anforderung vom Server abgelehnt wird.

Nummer 2 hat einen Haken daran. Es schützt nur die Daten, die Teil der Signatur sind. Wenn Sie Daten vergessen, kann ein Angreifer diese Daten ändern und eine andere Nachricht als die von Ihnen gesendete Nachricht senden. Aus diesem Grund müssen beim Signieren einer Anforderung alle der Anforderungsdaten enthalten sein: Der vollständige URI, einschließlich der Domäne, der Header, der Abfragezeichenfolgeparameter und aller gesendeten Daten wie XML oder JSON.

0

Wie naveen im Kommentar oben angedeutet, Ihre Frage scheint nicht ein OAuth zu sein Frage direkt:

Der Blick auf die (recht gute) Erklärung des OAuth - Flusses bei http://hueniverse.com/oauth/guide/authentication/ führt zu der Schlussfolgerung, dass alle Parameter in einer OAuth - Anfrage beim Signieren der Anfrage verwendet werden müssen, da der Server auch alle Parameter übernimmt Definition), um die Signatur zu validieren, so ist mein Vorschlag Verwendung alle Parameter für die Unterzeichnung auch;)

aber (als Randnotiz):

Ihr Code zeigt eine komplexen Datum strutcture, die unterbreitet werden sollen, so wirft dies einige Fragen: Wie Sie verschlüsseln die Daten, die über HTTP übertragbar sind? Wie sieht die Serverimplementierung aus (ist es Ihre eigene Implementierung oder ein bestimmter Dienst)?

Unter der Annahme, dass Sie die Daten in XML oder JSON serialisieren, um als Anforderungsparameter verwendet zu werden, erhalten Sie "nur eine Zeichenfolge" für die Daten. Diese Daten - die als Anforderungsparameter verwendet werden - werden vollständig zum Signieren verwendet, wie oben erwähnt.

Ich würde auch vorschlagen, eine Open-Source-OAuth-Client-Implementierung zu verwenden. Ein guter Ausgangspunkt für die Suche ist die Twitter Client Library-Seite unter https://dev.twitter.com/docs/twitter-libraries#dotnet, da Twitter OAuth für den Zugriff von Drittanbietern auf seine API verwendet und die Bibliotheken (OAuth-Komponenten wie Hammock) stabil sind.

+0

Es mag keine direkte OAuth-Frage sein, aber ich suche nach einer Anleitung, wie ich diese Art von Anfrage unter Verwendung von OAUth signieren könnte. Schließe ich alle Anforderungsparameter ein, was bedeuten würde, alle Anforderungstypen zu durchlaufen und sie hinzuzufügen? U schlagen vor, die Daten zu einer Zeichenfolge (z. B. JSON) zu serialisieren und diese zu verwenden. Warum tun dies nicht alle APIs (z. B. twitters REST API)? – Noel

+0

Irgendwann müssen Sie Ihr Anfrageobjekt in einige benannte Anfrageparameter konvertieren, die über HTTP übertragen werden können. Und Sie müssen alle Parameter einbeziehen, da der Server das gleiche tut, wenn er die Anfrage authentifiziert. Die Twitter-REST-API soll das Gleiche tun, weil sie auch Parameter benannt hat. – jCoder

+0

Es könnte auch hilfreich sein, wenn Sie weitere Informationen darüber geben könnten, wie Sie die Anfrage tatsächlich bearbeiten (welche Art von HTTP-Bibliothek verwenden Sie) und wie Sie das Anfrageobjekt in HTTP-Parameter für die eigentliche HTTP-Anfrage konvertieren. – jCoder

0

Wie bereits erwähnt, müssen Sie herausfinden, welche Angriffe Sie verhindern möchten.

Der übliche Ansatz für den Fall, dass sensible Daten gesendet werden, ist die Verwendung von HTTPS (SSL) für die Kommunikation mit dem Server. In diesem Fall müssen Sie die Daten nicht selbst verschlüsseln/signieren, irgendein einfaches Protokoll einschließlich des Sendens von JSON ist in Ordnung.

Wenn Sie verhindern möchten, dass unbekannte Clients die Daten posten, verwenden Sie mutual SSL, mit dem Sie begrenzen können, welcher Client mit dem Server kommunizieren kann.

Wenn Sie überprüfen möchten, dass Daten nicht über HTTP manipuliert werden - signieren Sie den gesamten Datenblock ... Aber es ist viel schwieriger, das, das vorhandene SSL-Verbindung verwendet, korrekt zu implementieren. Check out http://blogs.msdn.com/b/ericlippert/archive/2011/09/27/keep-it-secret-keep-it-safe.aspx

Verwandte Themen