验证API响应完整性

验证API响应完整性,api,service,web,response,integrity,Api,Service,Web,Response,Integrity,我正在为他们构建一套移动应用程序和一个附带的web服务。为了确保从应用程序到web服务的连接(达到合理的水平),我使用了两条腿的OAuth方法,每个应用程序使用一个唯一的消费者密钥/机密 我的问题是如何验证移动应用程序收到的响应实际上来自我的服务器。例如,如果我有一个端点,它可以确认用户是否可以通过传入一组布尔值来访问某些功能,就我所知,没有什么可以阻止某人修改其主机文件并发回一个伪造的响应,表明他们可以访问所有内容。这是正确的吗 我建议的解决方案是让应用程序存储服务器也知道的响应秘密。当服务器

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

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

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

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

简单地在HTTPS下托管web服务可以解决问题吗?还是有人仍然能够复制web服务并发送回伪造的响应


非常感谢

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

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

谢谢你,尤金。我希望你的评论能获得一些支持票,以再次向我保证这是一个安全的解决方案。既然这证实了我的怀疑,我就接受它。如果人们能帮忙确认一下,那就太好了。谢谢