背景:
我正在为REST Web服务设计身份验证方案.这并非"真正"需要安全(它更像是一个个人项目),但我希望尽可能安全地将其作为锻炼/学习体验.我不想使用SSL,因为我不想要麻烦,而且主要是设置它的费用.
这些SO问题对我开始特别有用:
我正在考虑使用简化版的Amazon S3身份验证(我喜欢OAuth,但它似乎对我的需求来说太复杂了).我正在为请求添加由服务器提供的随机生成的nonce,以防止重放攻击.
要回答这个问题:
S3和OAuth都依赖于对请求URL进行签名以及一些选定的标头.他们都没有签署 POST或PUT请求的请求体.这是不是容易受到中间人攻击,它会保留url和header并用攻击者想要的任何数据替换请求体?
看起来我可以通过在被签名的字符串中包含请求主体的哈希来防止这种情况.这样安全吗?
我有一个Spring REST应用程序,它首先使用基本身份验证进行保护.
然后我添加了一个登录控制器,它创建了一个JWT JSON Web令牌,用于后续请求.
我可以将以下代码移出登录控制器并进入安全过滤器吗?然后我不再需要登录控制器了.
tokenAuthenticationService.addTokenToResponseHeader(responseHeaders, credentialsResource.getEmail());
Run Code Online (Sandbox Code Playgroud)
或者我可以删除基本身份验证吗?
将基本身份验证与JWT混合是一种好的设计吗?
虽然一切正常,但我在这里有点黑暗,以便最好地设计这种安全性.
我一直在挖掘stackoverflow/security.stackexchange线程,并没有明确的答案为客户提供一种通用的方式来安全地使用我正在通过asp.net的web api构建的RESTful服务.在搜索这个答案时,我看到"授权"和"身份验证"可以互换使用,所以我想指出我只想验证请求身份和合法性.所以,在这一点上,我不是在验证用户.
亚马逊的模型似乎是"滚动你自己"时引用的模型,但是,在这种情况下,我确实理解亚马逊已经提供了每篇论文的"论文",所以这里没有太多的重新发明.这篇文章, 设计一个没有OAuth的安全REST(Web)API,非常有帮助.
我收集的是:
我对2的问题很少,或许,我的思绪无法绕过.首先,不是应该保密的app秘密吗?那么,如果一个javascript客户端发出请求,这不会影响app密钥的保密性吗?为什么有一个应用秘密然后我可以通过验证应用密钥,现时值和服务器IP验证请求身份?我确实理解像php,ruby或c#.net这样的服务器端语言不会暴露这个秘密,但我希望这对JS和编译语言来说都是普遍安全的.
最后,Facebook有一个开发人员安全检查表告诉开发人员"永远不要在客户端或可编译代码中包含你的App Secret",这会向我建议加密的web.config等.此解决方案不适用于将REST服务暴露给通过javascript消费的任何人.
其他线程我已经通过梳理:
http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
https://developers.facebook.com/docs/facebook-login/安全性/
保护REST API/Web服务的最佳实践
REST身份验证方案的安全性
HTTP基本身份验证而不是TLS客户端认证
RESTful身份验证