验证API响应完整性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证API响应完整性相关的知识,希望对你有一定的参考价值。

我正在为他们构建一套移动应用程序和随附的Web服务。为了确保从应用程序到Web服务的连接(达到合理的级别),我使用的是两条腿的OAuth方法,每个应用程序都使用唯一的消费者密钥/密钥。

我的问题是如何验证移动应用程序实际收到的来自我的服务器的响应。例如,如果我有一个端点,通过传入一组布尔值来确认用户是否可以访问某些功能,据我所知,没有什么可以阻止某人修改他们的主机文件并发回一个欺骗性的响应,表明他们可以访问一切。它是否正确?

我建议的解决方案是让应用程序存储服务器也知道的响应密钥。当服务器发送它的响应时,它会生成与秘密相结合的数据哈希值。然后,应用程序重新生成哈希并检查它是否匹配。这样,如果用户知道存储在应用程序中的秘密,则用户只能劫持该请求。

有没有解决这个问题的最佳实践?

简单地在HTTPS下托管Web服务可以解决问题,还是有人仍然能够复制Web服务并发回欺骗性响应?

非常感谢

答案

HTTPS旨在解决这个问题,并且做得很好(当然假设客户端不能被欺骗信任不应该信任的证书 - 对于大多数现实生活中的移动应用程序来说这不应该是一个问题场景)。我会坚持使用HTTPS而不是试图发明自己的解决方案。具体来说,在您提出的解决方案中,只需要攻击者获取应用程序的一个副本 - 他们可以对其进行反向工程,提取秘密,然后攻击所有其他副本。

另一答案

您可以使用HMAC来计算两端并比较结果,如果它相同则意味着它来自您的服务器。一个缺点是,攻击者是如此坚定并能够对您的应用进行逆向工程并提取HMAC中使用的密钥,然后这将结束。有一些方法可以避免这种情况,但这一切都取决于您的应用程序或数据的价值。最好的解决方案是使用数字签名和公钥加密。我不会推荐https因为它可以很容易地绕过,即使攻击者高度确定,但是根据应用程序的价值,证书固定效果不是很有效。

以上是关于验证API响应完整性的主要内容,如果未能解决你的问题,请参考以下文章

前后端分离开发,基于SpringMVC符合Restful API风格Maven项目实战(附完整Demo)!

服务器返回无效或不完整的 HTTP 响应

安全验证必备——语音验证码短信 API

使用 AFNetworking 未获得完整的响应标头

.net 核心:不完整的 JSON 响应

改造响应主体提交返回 null,但日志拦截器在 logcat 中显示完整响应