RESTauthenticationscheme的安全性
背景:
我正在deviseREST Web服务的身份validationscheme。 这并不是“真正的”需要安全的(这更像是一个个人项目),但是我想尽可能地保证它的安全性和学习体验的安全性。 我不想使用SSL,因为我不想要麻烦,而且大部分都是为了设置它。
这些SO问题让我开始特别有用:
- RESTfulauthentication
- 保护REST API / Web服务的最佳实践
- 最好的SOAP / REST / RPC Web API的例子? 你为什么喜欢他们? 他们有什么问题?
我正在考虑使用简化版本的Amazon S3身份validation (我喜欢OAuth,但似乎太复杂了,我的需要)。 我正在添加一个随机生成的服务器提供的nonce ,以防止重播攻击。
为了解决这个问题:
S3和OAuth都依靠签名请求URL和几个选定的标头。 他们都不签署 POST或PUT请求的请求正文 。 这难道不是一个中间人攻击,它保留了url和headers,并用攻击者想要的任何数据replace请求主体?
看起来好像我可以通过在被签名的string中包含请求主体的散列来防范这一点。 这是安全的吗?
以前的回答只是在数据传输的情况下提到了SSL,实际上并没有涵盖authentication。
您确实在询问有关安全authenticationREST API客户端的问题。 除非您使用TLS客户端身份validation,否则SSL 本身不是REST API的可行身份validation机制。 没有客户端authentication的SSL只authentication服务器 ,这对于大多数REST API来说是不相关的,因为你真的想要authentication客户端 。
如果您不使用TLS客户端身份validation,则需要使用类似基于摘要的身份validationscheme(如Amazon Web Service的自定义scheme)或OAuth 1.0a甚至HTTP基本身份validation(但仅限于SSL)。
这些schemevalidation请求是由某人预期发送的。 TLS(SSL)(无客户端身份validation)确保通过线路发送的数据保持不变。 它们是分开的,但是是相辅相成的。
对于那些有兴趣的人,我已经扩展了关于HTTPauthenticationscheme的SO问题以及它们如何工作 。
REST意味着使用networking标准,networking上“安全”传输的标准是SSL。 其他任何东西都会有点怪异,需要为客户端额外的部署工作,这将需要encryption库。
一旦你提交到SSL,原则上真的不需要authentication。 您可以再次使用Web标准,并使用HTTP基本身份validation(与每个请求一起发送的用户名和密码令牌),因为它比精细的签名协议简单得多,并且在安全连接的情况下仍然有效。 你只需要确保密码永远不会超过纯文本; 所以如果通过纯文本连接接收到密码,甚至可能会禁用密码并向开发人员发送邮件。 您还应该确保凭据在收到时不会logging到任何地方,就像您不会logging常规密码一样。
HTTP摘要是一种更安全的方法,因为它可以防止秘密令牌被传递; 相反,它是服务器可以在另一端validation的散列。 尽pipe如果你已经采取了上述的预防措施,那么对于不那么敏感的应用程序来说可能是过度的。 毕竟,用户的密码在login时已经以纯文本forms传输(除非您在浏览器中进行了一些奇妙的JavaScriptencryption),并且在每个请求中也使用了Cookie。
请注意,使用API时,客户端最好传递令牌(随机生成的string),而不是使用开发人员login到网站的密码。 因此,开发者应该能够login到您的网站并生成可用于APIvalidation的新令牌。
使用令牌的主要原因是,如果它被泄露,它可以被replace,而如果密码被泄露,所有者可以login到开发者的账户,并做任何他们想要的东西。 令牌的另一个优点是可以向同一个开发者发出多个令牌。 也许是因为他们有多个应用程序,或者因为他们想要不同的访问级别的标记。
(已更新,以涵盖仅使SSL连接的含义。)
或者你可以使用已知的解决scheme来解决这个问题,并使用SSL。 自签证书是免费的,它的个人项目是正确的?
如果你需要将主体的哈希值作为URL中的一个参数,并且该URL是通过私钥签名的,那么中间人攻击只能用能够生成内容的内容replace主体同样的散列。 现在至less可以轻松处理MD5哈希值,当SHA-1被破坏时,您就可以得到图片。
为了保护身体免遭篡改,您需要签名身体,这样一来,中间人攻击就不太可能破坏,因为他们不知道生成签名的私钥。
实际上,原始S3authentication允许内容被签名,尽pipeMD5签名很弱。 您可以简单地强制执行在HMAC中包含Content-MD5头的可选实践(要被签名的string)。
http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html
他们新的v4authenticationscheme更安全。
http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html
请记住,您的build议使客户端难以与服务器进行通信。 他们需要了解您的创新解决scheme,并相应地encryption数据,这种模式是不是很好的公共API(除非你是亚马逊\雅虎\谷歌..)。
无论如何,如果你必须encryption正文内容,我build议你去看看现有的标准和解决scheme,如:
XMLencryption(W3C标准)
XML安全