Jav*_*ier 3 php security android
我有一个 Android 应用程序,需要经常连接到服务器以检索或添加数据库中的敏感数据。我需要验证应用程序对服务器的调用是否是从应用程序发出的,因此我使用了这种方法:如何从服务器验证客户端的身份?它包含在服务器中验证的应用程序中的硬编码字符串密钥。但后来我意识到有像 dex2jar 这样的工具,它可以泄露我所有的代码(即使有 proguard 的一些混淆),特别是这个硬编码的密钥。
有没有更优雅、更安全的方法来验证服务器调用是否是从我的应用程序发出的?
PS:我对英语感到抱歉,显然我不是母语人士。
小智 5
如果只有您的客户端和服务器,您可以(并且应该)使用相互验证的 SSL,而无需购买任何东西。您控制服务器和客户端,因此每个客户端都应该只信任一个证书,该证书属于另一个证书,并且您不需要为此目的使用 CA。
这是高级方法。创建自签名服务器 SSL 证书并部署在您的 Web 服务器上。您可以使用 Android SDK 中包含的 keytool 来实现此目的。然后创建一个自签名客户端,并将其部署在应用程序中的自定义密钥库中,该密钥库作为资源包含在应用程序中(keytool 也将生成该客户端)。将服务器配置为需要客户端 SSL 身份验证并仅接受您生成的客户端证书。将客户端配置为使用该客户端证书来标识自身,并且仅接受您在服务器上安装的该部分的一个服务器端证书。
一步步的答案比这里所保证的要长得多。我建议分阶段进行此操作,因为网上有关于如何在 Android 中处理服务器端和客户端的自签名 SSL 证书的资源。我的书《Android 平台的应用程序安全性》(由 O'Reilly 出版)中也有完整的演练。
您通常会将该证书/私钥存储在某种类型的密钥库中(如果您使用的是 Android,则为 KeyStore),并且该密钥库将被加密。该加密基于密码,因此您需要 (1) 将该密码存储在客户端的某个位置,或者 (2) 在用户启动客户端应用程序时询问用户密码。您需要做什么取决于您的用例。如果(2)是可以接受的,那么您已经保护了您的凭据免受逆向工程的影响,因为它将被加密并且密码不会存储在任何地方(但用户需要每次都输入它)。如果您这样做(1),那么有人将能够对您的客户端进行逆向工程,获取密码,获取密钥库,解密私钥和证书,并创建另一个能够连接到服务器的客户端。
您无法阻止这种情况发生;你可以让逆向工程你的代码变得更加困难(通过混淆等),但你不能让它变得不可能。您需要确定您试图通过这些方法减轻的风险是什么,以及需要做多少工作来减轻风险。
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |