我从外部服务器检索数据以用于我的Android应用程序。我希望这些数据只能通过我的应用访问。我使用标准的http连接以json格式从apache / php服务器获取数据。我还向服务器发送一些参数来检索相关数据。现在,我打算做的是:
现在,问题是 - 这是一种关于逆向工程的安全方法吗?目前我认为没有其他可能获得这些数据。但如果有人能够反编译我的apk,他也将能够检索到这个“someSecretPhrase”(在服务器端很难做到),然后访问服务器,不是吗?这是真正的威胁吗?是否还有其他可能通过服务器验证我的应用程序?
我查看了论坛,例如。 Identify whether HTTP requests from Android App or not? and then respond appropriately,但他们没有解释反编译问题。
答案 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他们的应用(签名权限或自签名)。我们可以利用它来检查请求是否来自您的应用。
答案 4 :(得分:1)
不幸的是,如果有人反编译你的apk,那么它很容易看到你的字符串。
编辑:我认为没有更好的方法可以做到这一点..也许只有在Android版市场上发布你的应用程序并启用了Android版权保护...