我正在为他们构建一套移动应用程序和随附的Web服务。为了确保从应用程序到Web服务的连接(达到合理的级别),我使用的是两条腿的OAuth方法,每个应用程序都使用唯一的消费者密钥/密钥。
我的问题是如何验证移动应用程序实际收到的来自我的服务器的响应。例如,如果我有一个端点,通过传入一组布尔值来确认用户是否可以访问某些功能,据我所知,没有什么可以阻止某人修改他们的主机文件并发回一个欺骗性的响应,表明他们可以访问一切。这是对的吗?
我建议的解决方案是让应用程序存储服务器也知道的响应密钥。当服务器发送它的响应时,它会生成与秘密相结合的数据哈希值。然后,应用程序重新生成哈希并检查它是否匹配。这样,如果用户知道应用程序中存储的秘密,则用户只能劫持该请求。
是否有解决此问题的最佳做法?
简单地在HTTPS下托管Web服务可以解决问题,还是有人仍然可以复制Web服务并发回欺骗性响应?
非常感谢
答案 0 :(得分:0)
HTTPS旨在解决这个确切的问题,并且做得很好(当然假设客户端不能被欺骗信任不应该信任的证书 - 这对于大多数实际来说不应该是一个问题 - 生活移动应用场景)。 我会坚持使用HTTPS而不是试图发明自己的解决方案。具体来说,在您提出的解决方案中,只需要攻击者获取应用程序的一个副本 - 他们可以对其进行逆向工程,提取秘密,然后攻击所有其他副本。
答案 1 :(得分:0)
您可以使用HMAC计算两端并比较结果,如果它相同则意味着它来自您的服务器。一个缺点是,攻击者是如此坚定并能够对您的应用进行逆向工程并提取HMAC中使用的密钥,然后这将结束。有一些方法可以避免这种情况,但这一切都取决于您的应用程序或数据的价值。最好的解决方案是使用数字签名和公钥加密。我不会推荐https因为它可以很容易地绕过,即使攻击者高度确定,但是根据应用程序的价值,证书固定效果不是很有效。