REST身份验证方案的安全性

时间:2009-01-18 00:12:11

标签: rest authentication oauth amazon-s3 rest-security

背景:

我正在为REST Web服务设计身份验证方案。这并非“真正”需要保证安全(它更像是个人项目)但我希望尽可能安全地将其作为锻炼/学习体验。我不想使用SSL,因为我不想要麻烦,而且主要是花费很多钱来设置它。

这些SO问题对我开始特别有用:

我正在考虑使用Amazon S3's authentication的简化版本(我喜欢OAuth,但对我的需求来说似乎太复杂了)。我正在将一个由服务器提供的随机生成的nonce添加到请求中,以防止重放攻击。

要回答这个问题:

S3和OAuth都依赖于对请求URL进行签名以及一些选定的标头。 他们都没有为请求正文签署POST或PUT请求。难道这不容易受到中间人攻击,它会保留URL和标头并用攻击者想要的任何数据替换请求体吗?

似乎我可以通过在被签名的字符串中包含请求主体的哈希来防范这种情况。这样安全吗?

6 个答案:

答案 0 :(得分:164)

之前的回答仅提到了数据传输环境中的SSL,并没有真正涵盖身份验证。

您真的要求安全地验证REST API客户端。除非您使用TLS客户端身份验证,否则SSL 单独不是REST API的可行身份验证机制。没有客户端身份验证的SSL仅对服务器进行身份验证,这与大多数REST API无关,因为您确实要对客户端进行身份验证。

如果您不使用TLS客户端身份验证,则需要使用类似基于摘要的身份验证方案(如Amazon Web Service的自定义方案)或OAuth 1.0a甚至HTTP基本身份验证(但仅限SSL)。

这些方案验证请求是由预期的人发送的。 TLS(SSL)(无客户端身份验证)可确保通过线路发送的数据保持未被篡改。它们是分开的 - 但却是互补的 - 关注。

对于那些感兴趣的人,我已经扩展了关于HTTP Authentication Schemes and how they work的问题。

答案 1 :(得分:59)

REST意味着使用Web标准,而Web上的“安全”传输标准是SSL。其他任何东西都会有点时髦,需要为客户提供额外的部署工作,这些工作必须有加密库。

一旦你提交了SSL,原则上认证真的没什么必要。您可以再次使用Web标准并使用HTTP Basic auth(与每个请求一起发送的用户名和密钥令牌),因为它比精心设计的签名协议简单得多,并且在安全连接的上下文中仍然有效。你只需要确保密码永远不会超过纯文本;因此,如果通过纯文本连接接收密码,您甚至可以禁用密码并邮寄开发人员。您还应该确保在收到凭据时不会记录凭据,就像您不记录常规密码一样。

HTTP摘要是一种更安全的方法,因为它可以防止秘密令牌传递;相反,它是服务器可以在另一端验证的哈希。虽然如果采取上述预防措施,对于不太敏感的应用可能会有些过分。毕竟,用户的密码在登录时已经以纯文本形式传输(除非您在浏览器中进行了一些奇特的JavaScript加密),并且每个请求都使用了他们的cookie。

请注意,使用API​​时,客户端最好传递令牌 - 随机生成的字符串 - 而不是开发人员登录到网站的密码。因此,开发人员应该能够登录您的站点并生成可用于API验证的新令牌。

使用令牌的主要原因是如果它被泄露则可以替换它,而如果密码被泄露,则所有者可以登录开发者的帐户并随意执行任何操作。令牌的另一个优点是您可以向同一个开发人员发出多个令牌。也许是因为他们有多个应用程序,或者因为他们想要具有不同访问级别的令牌。

(已更新,涵盖了仅建立SSL连接的含义。)

答案 2 :(得分:8)

或者您可以使用此问题的已知解决方案并使用SSL。自签名证书是免费的,它是个人项目吗?

答案 3 :(得分:5)

如果您需要将正文的哈希作为URL中的参数之一并且该URL是通过私钥签名的,那么中间人攻击只能用以下内容替换正文会产生相同的哈希值。现在至少可以轻松处理MD5哈希值,当SHA-1被破坏时,你就可以了解它。

为了保护身体不被篡改,你需要一个身体的签名,中间人攻击不太可能破坏,因为他们不会知道私钥生成签名。

答案 4 :(得分:3)

事实上,原始的S3 auth 确实允许对内容进行签名,尽管MD5签名较弱。您可以简单地强制执行在HMAC中包含Content-MD5标头的可选做法(要签名的字符串)。

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

他们的新v4身份验证方案更安全。

http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

答案 5 :(得分:1)

请记住,您的建议使客户难以与服务器通信。他们需要了解您的创新解决方案并相应地加密数据,这种模型对于公共API来说并不是那么好(除非您是amazon \ yahoo \ google ..)。

无论如何,如果你必须加密身体内容,我建议你查看现有的标准和解决方案,如:

XML加密(W3C标准)

XML Security