3

我有一个需要经常连接到服务器以检索或添加数据库敏感数据的 android 应用程序。我需要验证从应用程序对服务器的调用,所以我使用了这种方法:如何从服务器验证客户端的身份?它包含在服务器中验证的应用程序中的硬编码字符串键。但后来我意识到有像 dex2jar 这样的工具,可以显示我所有的代码(即使有一些来自 proguard 的混淆),特别是这个硬编码的密钥。

有没有更优雅和安全的方法来验证服务器调用是从我的应用程序发出的?

PS:对不起英语,显然我不是母语人士。

4

1 回答 1

5

如果它只是您的客户端和服务器,您可以(并且应该)使用相互验证的 SSL 而无需购买任何东西。您控制服务器和客户端,因此每个人都应该只信任一个证书,一个属于另一个证书,并且您不需要为此目的的 CA。

这是高级方法。创建一个自签名服务器 SSL 证书并部署在您的 Web 服务器上。为此,您可以使用 Android SDK 中包含的 keytool。然后创建一个自签名客户端并将其部署在您的应用程序中作为资源包含在您的应用程序中的自定义密钥库中(keytool 也会生成它)。将服务器配置为要求客户端 SSL 身份验证并仅接受您生成的客户端证书。将客户端配置为使用该客户端证书来标识自己,并且只接受您在服务器上安装的一个服务器端证书用于该部分。

一步一步的回答比这里保证的要长得多。我建议分阶段执行此操作,因为网络上有关于如何在服务器端和客户端处理 Android 中的自签名 SSL 证书的资源。O'Reilly 出版的我的书《Android 平台的应用程序安全性》中也有完整的演练。

您通常会将该证书/私钥存储在某种类型的密钥库中(如果您使用的是 Android,则为密钥库),并且该密钥库将被加密。该加密基于密码,因此您需要 (1) 将该密码存储在客户端中的某个位置,或者 (2) 在用户启动客户端应用程序时询问用户密码。您需要做什么取决于您的用例。如果 (2) 是可以接受的,那么您已经保护了您的凭证免受逆向工程的影响,因为它将被加密并且密码不会存储在任何地方(但用户每次都需要输入它)。如果您这样做 (1),那么有人将能够对您的客户端进行逆向工程、获取密码、获取密钥库、解密私钥和证书,并创建另一个能够连接到服务器的客户端。

您无法采取任何措施来防止这种情况发生;你可以使你的代码更难逆向工程(通过混淆等),但你不能让它变得不可能。您需要确定使用这些方法试图减轻的风险是什么,以及需要做多少工作来减轻风险。

于 2012-04-14T17:22:51.467 回答