背景:
我正在为 REST Web 服务设计身份验证方案。这并不“真的”需要安全(它更像是一个个人项目),但我想让它尽可能安全,就像锻炼/学习体验一样。我不想使用 SSL,因为我不想要麻烦,而且主要是设置它的费用。
我正在考虑使用简化版本的Amazon S3 身份验证(我喜欢OAuth,但它似乎对我的需求来说太复杂了)。我将服务器提供的随机生成的nonce添加到请求中,以防止重放攻击。
要解决这个问题:
S3 和 OAuth 都依赖于对请求 URL 以及一些选定的标头进行签名。他们都没有为 POST 或 PUT 请求 签署请求正文。 这是否容易受到中间人攻击,它保留 url 和 headers 并用攻击者想要的任何数据替换请求正文?
似乎我可以通过在签名的字符串中包含请求正文的哈希来防止这种情况。这安全吗?
先前的答案仅在数据传输的上下文中提到 SSL,实际上并未涵盖身份验证。
您确实在询问安全地验证 REST API 客户端。除非您使用 TLS 客户端身份验证,否则 单独 的 SSL 不是 REST API 的可行身份验证机制。没有客户端身份验证的 SSL 仅对 服务器 进行身份验证,这与大多数 REST API 无关,因为您确实想要对 客户端 进行身份验证。
如果您不使用 TLS 客户端身份验证,则需要使用基于摘要的身份验证方案(如 Amazon Web Service 的自定义方案)或 OAuth 1.0a 甚至 HTTP 基本身份验证(但仅通过 SSL)。
这些方案验证请求是由预期的人发送的。TLS (SSL)(无客户端身份验证)确保通过网络发送的数据不会被篡改。它们是独立但互补的关注点。
对于那些感兴趣的人,我已经扩展了关于HTTP 身份验证方案及其工作原理的 SO 问题。