安全地从Android应用程序连接到Web服务

Chr*_*oot 5 security android web-services

我目前正在开发一个应用程序,它从我编写的Web服务(在.net中)下载信息,我想保护连接,以便只有我的应用程序才能从服务中获取数据.解决这个问题的最佳方式是什么?

如果他们对我的应用进行反编译/反向工程,我不希望任何人能够获取访问详细信息.有没有办法可以在发送之前验证请求数据的应用程序的完整性?

我不关心他们是否能够嗅到流量来查看它包含的内容,我只是不希望我的应用程序之外的任何内容能够提交请求以防止任何人抓取所有数据.

我是安全的新手,请尽可能简单!

Ujj*_*wan 2

克里斯,

您可以阅读一种称为一次性密码 (OTP) 的机制。 http://en.wikipedia.org/wiki/One-time_password

您可以将应用程序设计为在尝试连接到您的 Web 服务时生成 OTP。验证 OTP 真实性的责任在于 Web 服务。

现在让我详细介绍一下。想象一下,您的应用程序中嵌入了一种算法,每当连接到 Web 服务时,该算法都会生成并提供 256 位数字。您设计的 Web 服务还实现了 OTP 的验证器部分。通常 OTP 算法在其实现中会考虑“一天中的时间”(我建议谷歌搜索一些免费的实现)。因此,服务器端(OTP 验证器)仅在服务器和客户端上的时间位于刷新时间 n 的窗口(例如 +- n 秒)内时才工作。通常,OTP 验证器也会在其一端生成 OTP,并仅比较接收到的 OTP。您还可以在发送之前对 OTP 进行哈希处理,并比较服务器上生成的 OTP 的哈希值(但没有帮助或者更安全)。

现在问题来了,如果有人得到了算法怎么办(可能你只是使用开源 OTP)。嗯,这是注定的。即使攻击者可以使用其他所有内容,也只能使用正确的密码才能访问良好的安全实施。为此,您可能需要添加一个逻辑来在应用程序首次连接时对其进行配置,这正是 OTP 所期望的。这里我假设第一次使用时信任。您可以添加一些逻辑来存储计算 OTP 时使用的唯一驻留应用程序 ID。此外,您还需要在服务器上维护“resident-id”到“public-id”的映射。您可以将其附加到 OTP 并发送到服务器以验证发送的应用程序确实是您配置的“公共 ID”。这需要您将“public-id”映射到服务器上的“resident-id”,然后以相同的方式使用“provisioned-id”来生成 OTP。

最重要的是,您可以添加逻辑以仅接受 OTP+“public-id”组合一次。如果有人只是嗅探并将相同的请求重新发送到您的网络服务,这将防止重放攻击。

希望这能给您一些想法。

乌杰瓦尔