Zend_Oauth-SecurityArchitecture.xml 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect2 id="zend.oauth.introduction.security-architecture">
  4. <title>Security Architecture</title>
  5. <para>
  6. OAuth was designed specifically to operate over an insecure <acronym>HTTP</acronym>
  7. connection and so the use of <acronym>HTTPS</acronym> is not required though obviously it
  8. would be desireable if available. Should a <acronym>HTTPS</acronym> connection be feasible,
  9. OAuth offers a signature method implementation called PLAINTEXT which may be utilised. Over
  10. a typical unsecured <acronym>HTTP</acronym> connection, the use of PLAINTEXT must be avoided
  11. and an alternate scheme using. The OAuth specification defines two such signature methods:
  12. HMAC-SHA1 and RSA-SHA1. Both are fully supported by <classname>Zend_Oauth</classname>.
  13. </para>
  14. <para>
  15. These signature methods are quite easy to understand. As you can imagine, a PLAINTEXT
  16. signature method does nothing that bears mentioning since it relies on
  17. <acronym>HTTPS</acronym>. If you were to use PLAINTEXT over <acronym>HTTP</acronym>, you are
  18. left with a significant problem: there's no way to be sure that the content of any OAuth
  19. enabled request (which would include the OAuth Access Token) was altered en route. This is
  20. because unsecured <acronym>HTTP</acronym> requests are always at risk of eavesdropping, Man
  21. In The Middle (MITM) attacks, or other risks whereby a request can be retooled so to speak
  22. to perform tasks on behalf of the attacker by masquerading as the origin application without
  23. being noticed by the service provider.
  24. </para>
  25. <para>
  26. HMAC-SHA1 and RSA-SHA1 alleviate this risk by digitally signing all OAuth requests with the
  27. original application's registered Consumer Secret. Assuming only the Consumer and the
  28. Provider know what this secret is, a middle-man can alter requests all they wish - but they
  29. will not be able to validly sign them and unsigned or invalidly signed requests would be
  30. discarded by both parties. Digital signatures therefore offer a guarantee that validly
  31. signed requests do come from the expected party and have not been altered en route. This is
  32. the core of why OAuth can operate over an unsecure connection.
  33. </para>
  34. <para>
  35. How these digital signatures operate depends on the method used, i.e. HMAC-SHA1, RSA-SHA1 or
  36. perhaps another method defined by the service provider. HMAC-SHA1 is a simple mechanism
  37. which generates a Message Authentication Code (MAC) using a cryptographic hash function
  38. (i.e. SHA1) in combination with a secret key known only to the message sender and receiver
  39. (i.e. the OAuth Consumer Secret and the authorized Access Key combined). This hashing
  40. mechanism is applied to the parameters and content of any OAuth requests which are
  41. concatenated into a "base signature string" as defined by the OAuth specification.
  42. </para>
  43. <para>
  44. RSA-SHA1 operates on similar principles except that the shared secret is, as you would
  45. expect, each parties' RSA private key. Both sides would have the other's public key with
  46. which to verify digital signatures. This does pose a level of risk compared to HMAC-SHA1
  47. since the RSA method does not use the Access Key as part of the shared secret. This means
  48. that if the RSA private key of any Consumer is compromised, then all Access Tokens assigned
  49. to that Consumer are also. RSA imposes an all or nothing scheme. In general, the majority of
  50. service providers offering OAuth authorization have therefore tended to use HMAC-SHA1 by
  51. default, and those who offer RSA-SHA1 may offer fallback support to HMAC-SHA1.
  52. </para>
  53. <para>
  54. While digital signatures add to OAuth's security they are still vulnerable to other forms of
  55. attack, such as replay attacks which copy earlier requests which were intercepted and
  56. validly signed at that time. An attacker can now resend the exact same request to a
  57. Provider at will at any time and intercept its results. This poses a significant risk but it
  58. is quiet simple to defend against - add a unique string (i.e. a nonce) to all requests which
  59. changes per request (thus continually changing the signature string) but which can never be
  60. reused because Providers actively track used nonces within the a certain window defined by
  61. the timestamp also attached to a request. You might first suspect that once you stop
  62. tracking a particular nonce, the replay could work but this ignore the timestamp which can
  63. be used to determine a request's age at the time it was validly signed. One can assume that
  64. a week old request used in an attempted replay should be summarily discarded!
  65. </para>
  66. <para>
  67. As a final point, this is not an exhaustive look at the security architecture in OAuth. For
  68. example, what if <acronym>HTTP</acronym> requests which contain both the Access Token and
  69. the Consumer Secret are eavesdropped? The system relies on at one in the clear transmission
  70. of each unless <acronym>HTTPS</acronym> is active, so the obvious conclusion is that where
  71. feasible <acronym>HTTPS</acronym> is to be preferred leaving unsecured
  72. <acronym>HTTP</acronym> in place only where it is not possible or affordable to do so.
  73. </para>
  74. </sect2>