背景:
我正在设计一个REST web服务的认证方案。这并不是“真正”需要安全保障的(它更像是一个个人项目),但我希望尽可能地使它安全,作为一种锻炼/学习经验。我不想使用SSL,因为我不想麻烦,而且主要是为了避免设置它的费用。
以下Stack Overflow问题对我开发起到了很大帮助:
- RESTful Authentication
- Best Practices for securing a REST API / web service
- Examples of the best SOAP/REST/RPC web APIs? And why do you like them? And what’s wrong with them?
我考虑使用Amazon S3的身份验证的简化版本(我喜欢OAuth,但它对我的需求来说似乎太复杂了)。我将在请求中添加由服务器提供的随机生成的nonce,以防止重放攻击。
接下来是问题:
Amazon S3和OAuth都依赖于签署请求URL以及几个选定的标头。对于POST或PUT请求,它们都不会对请求正文进行签名。这不会容易受到中间人攻击的影响吗?中间人可以保留URL和标头,并替换请求体为攻击者想要的任何数据。
看起来我可以通过在被签名的字符串中包括请求体的哈希值来防范这种攻击。这是安全的吗?