我目前正在开发一个应用程序,该应用程序从我编写的网络服务(在 .net 中)下载信息,我想保护连接,以便只有我的应用程序可以从该服务获取数据。解决这个问题的最佳方法是什么?
我不希望任何人在反编译/逆向工程我的应用程序时能够获得访问详细信息。有没有一种方法可以在发回数据之前验证请求数据的应用程序的完整性?
我不关心他们是否能够嗅探流量以查看其中包含的内容,我只是不希望我的应用程序以外的任何东西能够提交请求以防止任何人抓取所有数据。
我是安全方面的新手,请尽可能简单!
最佳答案
克里斯,
您可以阅读一种称为一次性密码 (OTP) 的机制。 http://en.wikipedia.org/wiki/One-time_password
您可以将您的应用程序设计为在它尝试连接到您的网络服务时生成 OTP。验证 OTP 真实性的责任在于网络服务。
现在让我详细介绍一下。想象一下,您的应用程序在其中嵌入了一种算法,每当它连接到 Web 服务时,该算法就会生成并提供一个 256 位数字。您设计的 Web 服务还实现了 OTP 的验证器部分。通常 OTP 算法会在其实现中考虑“一天中的时间”(我建议谷歌搜索一些免费实现)。因此,服务器端(OTP 验证器)仅在服务器和客户端上的时间在刷新时间 n 的窗口(比如 +- n 秒)内时才有效。通常,OTP 验证器也会在其端生成 OTP 并仅比较接收到的 OTP。您还可以在发送之前对 OTP 进行哈希处理,并比较服务器上生成的 OTP 的哈希值(虽然没有帮助,但更安全)。
现在问题来了,如果有人得到了算法怎么办(可能你只是使用了一个开源 OTP)。嗯,它的意思是。一个好的安全实现只有使用正确的密码才能访问,即使攻击者可以使用其他一切。为此,您可能必须添加一个逻辑来在应用程序首次连接时提供它们,这是 OTP 所期望的。在这里,我假设信任首次使用。您可以添加一些逻辑来存储计算 OTP 时使用的唯一驻留应用程序 ID。此外,您将在服务器上维护“resident-id”到“public-id”的映射。它是您可以附加到 OTP 并发送到服务器以验证发送的应用程序确实是您配置的“公共(public) ID”。这需要您在服务器上将“public-id”映射到“resident-id”,然后以相同的方式使用“provisioned-id”生成 OTP。
最重要的是,您可以添加逻辑来仅接受一次 OTP+“public-id”组合。这将防止重播攻击,以防有人只是嗅探并将相同的请求重新发送到您的网络服务。
希望这能给你一些想法。
乌吉瓦尔
关于android - 从 Android 应用程序安全地连接到 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6790417/