检查http请求是否来自我的Android应用程序

时间:2011-12-28 00:34:51

标签: php android md5 security

我从外部服务器检索数据以用于我的Android应用程序。我希望这些数据只能通过我的应用访问。我使用标准的http连接以json格式从apache / php服务器获取数据。我还向服务器发送一些参数来检索相关数据。现在,我打算做的是:

  1. 发送参数
  2. 发送类似md5的内容(“someSecretPhrase”+ params)。
  3. 检查服务器端的密码短语是否正确。
  4. 现在,问题是 - 这是一种关于逆向工程的安全方法吗?目前我认为没有其他可能获得这些数据。但如果有人能够反编译我的apk,他也将能够检索到这个“someSecretPhrase”(在服务器端很难做到),然后访问服务器,不是吗?这是真正的威胁吗?是否还有其他可能通过服务器验证我的应用程序?

    我查看了论坛,例如。 Identify whether HTTP requests from Android App or not? and then respond appropriately,但他们没有解释反编译问题。

5 个答案:

答案 0 :(得分:8)

安全性的基本规则之一是:您不信任客户端数据。如初。

你应该认为你的应用程序是反编译的,所有"秘密"攻击者已知的密钥等。

但是,您可以阻止攻击者尝试伪造您的请求。发送(和验证)您的请求的校验和是一种方法(您对MD5(secret_key + params)的想法)。

您还可以切换到二进制加密协议。但这需要更多的工作和相当不同的服务器架构。

答案 1 :(得分:2)

让您的应用程序与服务器进行握手,因此算法不仅仅是一个字符串,而是一个完整的过程。使用会话/数据库来跟踪握手

答案 2 :(得分:2)

您可以通过在strings.xml中设置所有网址链接和参数名称来隐藏链接,例如: http://wwww.yourdomain.com/yourpage.any 用户名 并获取网址:

String serverUrl = Resources.getsystem().getstring(R.strings.name_your_link_id); String parameterKey = Resources.getsystem().getstring(R.strings.name_your_parameter_id); Uri url = Uri.parse(serverUrl+"?"+parameterKey+"=" + yorusername);

并发出任何http请求 HttpURLConnection con =(HttpURLConnection)url.openConnection();

当任何人试图反编译您的应用时,他将只显示id为R.java文件中的长整数获取此类代码 String serverUrl = Resources.getsystem().getstring(12346546564); String parameterKey = Resources.getsystem().getstring(123321321132);

答案 3 :(得分:2)

Android要求在安装之前应该sign他们的应用(签名权限或自签名)。我们可以利用它来检查请求是否来自您的应用。

  1. 使用您的证书对您的应用进行签名。
  2. Find证书签名并将其保存在后端服务器中。
  3. 对于每个请求,都希望应用程序发送此签名。
  4. 验证应用程序在服务器级别发送的签名,并仅在匹配时才接受。
  5. 即使在有人篡改您的应用的情况下,他也必须在安装之前再次签名,这会改变应用签名,我们的验证机制会简单地拒绝所有此类请求。

    此答案基于this博客。使用https进行应用< - >服务器通信。

答案 4 :(得分:1)

不幸的是,如果有人反编译你的apk,那么它很容易看到你的字符串。

编辑:我认为没有更好的方法可以做到这一点..也许只有在Android版市场上发布你的应用程序并启用了Android版权保护...