我有一个Android应用程序,需要频繁连接到服务器以检索或添加数据库中的敏感数据。 我需要验证在从应用所取得的呼叫服务器,所以我用这个方法: 如何验证从服务器的客户端的身份? 这在于在服务器验证的应用程序的硬编码字符串键。 但后来我意识到有像dex2jar工具,这将透露我的所有代码(即使有一些ProGuard的混淆),尤其在该硬编码的关键。
有没有验证服务器的呼叫正在从我的应用程序所做的任何更优雅和安全的方式?
PS:我很抱歉的英文,显然我不是一个母语。
我有一个Android应用程序,需要频繁连接到服务器以检索或添加数据库中的敏感数据。 我需要验证在从应用所取得的呼叫服务器,所以我用这个方法: 如何验证从服务器的客户端的身份? 这在于在服务器验证的应用程序的硬编码字符串键。 但后来我意识到有像dex2jar工具,这将透露我的所有代码(即使有一些ProGuard的混淆),尤其在该硬编码的关键。
有没有验证服务器的呼叫正在从我的应用程序所做的任何更优雅和安全的方式?
PS:我很抱歉的英文,显然我不是一个母语。
如果只有你的客户和你的服务器,你可以(也应该)使用相互认证的SSL,无需购买任何东西。 您可以控制服务器和客户端,所以每个人都应该只相信一个证书,一个属于其他和你不需要的CA用于这一目的。
这里是高层次的方法。 创建一个自签名的服务器SSL证书,并部署在Web服务器上。 您可以使用包含在Android SDK用于此目的的密钥工具。 然后创建一个自签名的客户端和部署在自定义密钥库您的应用程序中包含在你的应用程序作为一个资源(密钥工具会产生这个问题,以及)。 将服务器配置为需要客户端SSL认证,并只接受您生成的客户端证书。 配置客户端使用客户端证书证明自己的身份,只接受你的服务器的那一部分上安装一个服务器端证书。
一步一步的,这是不是在这里保证更长的答案。 我建议分阶段这样做,因为有关于如何应对Android的自签名的SSL证书,服务器和客户端在网络上的资源。 还有一个完整的步行通过我的书,应用安全为Android平台,由O'Reilly出版。
你会通常存储在sometype。这时候的密钥库证书/私钥(密钥库,如果你使用的是Android)和密钥库将被加密。 这种加密是基于密码的,所以你要么需要(1)存储的密码在你的客户的地方,或(2)要求用户输入密码时,他们开始您的客户端应用程序。 什么,你需要做的取决于你的用例。 如果(2)是可以接受的,那么你保护你的凭证针对逆向工程,因为它会被加密,密码不会被存储在任何地方(但用户需要将其在每次输入)。 如果你这样做(1),然后会有人能够扭转工程师您的客户端,获取密码,获取密钥存储,解密私钥和证书,并创建另一个客户端将能够连接到服务器。
没有什么可以做,以防止这种情况; 可以使逆向工程您的代码更难(通过混淆等),但你不能使它不可能。 你需要确定你正在尝试用这些方法来减轻风险,有多少工作是值得做的,以减轻它。