2011-12-29 51 views
0

可能重复:
securing connection to php server应用认证

我正在写一个移动应用程序来访问一个在线数据库(我更感兴趣的是高级算法/协议比平台特定的实现)。

由于保持数据库更新需要大量的工作,我只想限制对我的赞助应用程序的访问(我不希望其他应用程序免费利用我的数据库)。为此,我需要验证应用程序本身,但我该怎么做?

如果我在应用程序中存储某种凭据,有人可能会尝试反汇编程序,检索数据并绕过我的应用程序编写自己的应用程序(即使我加密凭证,仍然需要将解密密钥存储在某处)。 )

回答

0

你想要做的是采用相互认证的SSL,这样你的服务器将只接受来自你的应用的传入连接,你的应用只会与你的服务器通信。

这是高层次的方法。创建一个自签名服务器SSL证书并部署到您的Web服务器上。为此,您可以使用Android SDK附带的keytool(如果您使用的是Android;其他平台也有相似的工具)。然后创建一个自签名客户端,并将其作为资源部署在您的应用程序中的一个自定义密钥库中(keytool也会生成这个)。将服务器配置为需要客户端SSL身份验证,并仅接受您生成的客户端证书。配置客户端使用该客户端证书来标识自身,并且只接受您在服务器上安装的那一部分服务器端证书。

如果您的应用程序以外的某个人/某个人尝试连接到您的服务器,则SSL连接将不会被创建,因为服务器将拒绝未显示您已包含在您的应用程序中的客户端证书的传入SSL连接。

这是一个比这里保证的更长的答案。我建议分步实施,因为网上有资源介绍如何处理Android中的自签名SSL证书,包括服务器和客户端。在O'Reilly出版的我的书“Application Security for the Android Platform”中还有一个Android应用程序的完整漫游。

现在......您是对的,有权访问移动应用程序的人可以恢复与客户端证书关联的私钥。这将在BKS密钥库中进行加密,但您的应用程序需要提供密码才能打开该密钥库。因此,有人可以对您的应用程序进行逆向工程(在Android平台上相当简单),获取密码,获取密钥库并解密它以恢复客户端私钥。您可以通过对应用进行模糊处理来减轻这一点,使密钥库密码逆转更加困难,或者要求用户登录到应用程序并使用该密码来获取密钥库的密码等等,这实际上取决于级别您愿意承担您的应用程序的风险。