# Architektur der Sicherheit

OAuth wurde speziell designt um über eine unsichere HTTP Verbindung zu arbeiten und deshalb ist die Verwendung von HTTPS nicht notwendig obwohl es natürlich wünschenswert wäre wenn es vorhanden ist. Sollte eine HTTPS Verbindung möglich sein bietet OAuth die Implementation einer Signaturmethode an welche PLAINTEXT heißt und verwendet werden kann. Über eine typische unsichere HTTP Verbindung muss die Verwendung von PLAINTEXT verhindert werden und ein alternatives Schema wird verwendet. Die OAuth Spezifikation definiert zwei solcher Signaturmethoden: HMAC-SHA1 und RSA-SHA1. Beide werden von `Zend_Oauth` vollständig unterstützt.

Diese Signaturmethoden sind recht einfach zu verstehen. Wie man sich vorstellen kann macht die PLAINTEXT Signaturmethode nichts das erwähnenswert wäre da Sie auf HTTPS aufsetzt. Wenn man aber PLAINTEXT über HTTP verwenden würde, dann würde ein signifikantes Problem bestehen: Es gibt keinen Weg um sicherzustellen das der Inhalt einer OAuth-aktivierten Anfrage (welche einen OAuth Zugriffstoken enthalten würde) beim Routen verändert wurde. Das ist der Fall weil unsichere HTTP Anfragen immer das Risiko des Lauschens, von Man In The Middle (MITM) Attacken, oder andere Risiken haben können in denen eine Anfrage weiterbearbeitet werden könnten und damit Arbeiten im Sinne des Angreifers ausgeführt werden indem sich dieser als Originalanwendung maskiert ohne das dies vom Serviceprovider bemerkt wird.

HMAC-SHA1 und RSA-SHA1 vermindern dieses Risiko indem alle OAuth Anfragen mit dem originalen von der Anwendung registrierten Konsumentengeheimnis digital signiert werden. Angenommen nur der Konsument und der Provider wissen was das Geheimnis ist, dann kann ein Mann in der Mitte soviele Anfragen verändern wie er will - aber er wird nicht in der Lage sein sie gültig zu signieren und unsignierte oder ungültig signierte Anfragen würden von beiden Parteien ausgeschieden werden. Digitale Signaturen bieten deshalb eine Garantie das gültig signierte Anfragen von der erwarteten Partei kommen und beim Routen nicht verändert wurden. Das ist der Kern warum OAuth über eine unsichere Verbindung arbeiten kann.

Wie diese digitalen Signaturen arbeiten hängt von der verwendeten Methode ab, z.B. HMAC-SHA1, RSA-SHA1 oder möglicherweise eine andere Methode welche vom Serviceprovider definiert wird. HMAC-SHA1 ist ein einfacher Mechanismus welcher einen Nachrichten Authentifizierungscode (MAC) erzeugt indem eine kryptographische Hash Funktion (z.B. SHA1) in Verbindung mit einem geheimen Schlüssel verwendet wird der nur dem Sender und dem Empfänger der Nachricht bekannt sind (z.b. das Konsumentengeheimnis von OAuth kombiniert mit dem authorisierten Zugriffsschlüssel). Dieser Hashing Mechanismus wird den Parametern und dem Inhalt aller OAuth Anfragen angehängt und zu einem "Basissignatur String" zusammengefügt wie es von der OAuth Spezifikation definiert ist.

RSA-SHA1 operiert auf ähnlichen Prinzipien ausser dass das Geheimnis welches geteilt wird, wie man es erwarten würde, der private RSA Schlüssel jeder Partei ist. Beide Seiten haben den öffentlichen Schlüssel des anderen mit dem die digitalen Signaturen geprüft werden. Das führt verglichen mit HMAC-SHA1 zu einem Riskolevel da die RSA Methode keinen Zugriffsschlüssel als teil des geteilten Geheimnisses verwendet. Dies bedeutet dass wenn der private RSA Schlüssel eines Konsumenten kompromitiert ist, sind es alle zugeordneten Zugriffstoken dieses Konsumenten auch. RSA führt zu einem alles oder gar nichts Schema. Generell tendiert die Mehrheit der Serviceprovider welche OAuth Authorisierung anbieten dazu HMAC-SHA1 standardmäßig zu verwenden, und jene welche RSA-SHA1 anbieten können eine Fallback Unterstützung für HMAC-SHA1 anbieten.

Wärend digitale Signaturen zur Sicherheit von OAuth beitragen sind Sie trotzdem für andere Formen von Attacken angreifbar, wie Replay Attacken welche vorhergehende Anfragen aufgezeichnet und zu einer Zeit geprüft und signiert wurden. Ein Angreifen können jetzt exakt die gleiche Anfrage zum Provider wie er will und zu jeder Zeit senden und seine Ergebnisse auffangen. Das führt zu einem signifikanten Risiko aber es ist recht einfach sich davor zu schützen - einen eindeutigen String (z.b. eine Nonce) bei allen Anfragen hinzufügen welcher sich bei jeder Anfrage ändert (dies verändert laufend den Signaturstring) kann aber niemals wiederverwendet werden weil Provider verwendete Nonces zusammen mit einem bestimmten Fenster aktiv verfolgen welches vom Timestamp definiert wird der einer Anfrage auch angehängt wird. Man würde erwarten das wenn die Verfolgung einer bestimmten Nonce gestoppt wird, das wiederabspielen funktionieren würde, aber das ignoriert den Timestamp der verwendet werden kann um das Alter einer Anfrage zu ermitteln zu welcher Sie digital signiert wurde. Man kann also annehmen dass die eine Woche alte Anfrage in einem Wiederholungsversuch abgespielt wird, auf ähnliche Weise verworfen wird.

Als letzter Punkt erwähnt, ist dies keine exzessive Ansicht der Sicherheitsarchitektur in OAuth. Was passiert zum Beispiel wenn HTTP Anfragen welche sowohl den Zugriffstoken als auch das Geheimnis des Konsumenten enthalten abgehört werden? Das System ist auf der einen Seite von einer klaren Übermittlung von allem abhängig solange HTTPS nicht aktiv ist. Deshalb ist die naheliegende Feststellung das HTTPS, dort wo es möglich ist zu bevorzugen ist und HTTP nur an solchen Orten eingesetzt wird so es nicht anders möglich oder nicht erschwinglich ist.