6

基本上,我想要实现的是托管一个 CSV 文件,该文件将被我的应用程序检索并用作填充某些表的数据源。CSV 将使用最新数据进行更新,我设想应用程序会经常获取最新版本,以确保其中的数据是最新的。

我的问题是是否可以确保此远程 CSV 资源仅由我的应用程序使用?

据推测,如果我只是在 CSV 的位置上做了一个计划 URL,这可能会被嗅探并被其他人使用。我看不出如何限制对它的访问,因为用户几乎可以通过任何连接使用该应用程序。

如果我对文件使用某种加密,如果有人反编译了 java apk 文件,是否可能会暴露解密密钥?

是否有任何其他方法可以确保我的 csv 数据源仅由我的应用程序使用?

谢谢

(我使用 CSV 是因为数据不是很复杂,并且不需要数据库,我已经阅读了一些关于使用数据库时解决此问题的 App->webservice->database 方法)

4

5 回答 5

13

你问的问题应该是:我能让饼干活得有多难?如果您通过 Playstore 分发您的应用程序,请查看这个问题,即使它被标记为偏离主题,答案和链接也很有价值。

我假设,您的应用程序不是免费的(因为 .csv 似乎很有价值),因此请更深入地了解许可验证库和这篇博文,尤其是。部分技术:将许可证验证卸载到受信任的服务器技术:使您的应用程序防篡改

简而言之,据我了解,您的方式如下:

  1. 使用您的 RSA 公钥将您的 apk 上传到谷歌。
  2. 在您的应用程序中实现 LVL 请求(无需加密,也无需在应用程序包中使用私钥!**
  3. 通过安全的 SSL 连接将 lvl 响应转发到您的服务器
  4. 在您受信任的服务器上,使用您的 RSA 私钥,您应该检查博文中提到的内容,尤其是。将请求的用户 ID 放入数据库并计算来自单个 UID 的请求,如果它远高于平均水平,您可以假设此用户 ID 是用于无效请求的用户 ID。
  5. 如果支票有任何问题,请不要回复
  6. 如果一切正常,请回复您的 csv。仅将您的数据保留在 android 客户端上,如果您希望用户在没有连接的情况下使用 csv,否则任何有根设备或破解的 apk 都可以访问并重新分发 csv - 更好:只将 csv 的请求部分(例如行)推送到用户

请参阅此问题并查找重放攻击以及如何防止它,以不让任何人重放提供 csv 或其部分的调用(例如每个 UID 的序列号)。

尽可能地混淆你的代码,使工作更加困难,就像已经提到的@VinceFR。

还有一些攻击,比如这两个:

  • 根设备并检查存储的 csv,而不是重新分发 - 这就是您不想将 csv 存储在客户端上的原因
  • 对您的应用程序进行逆向工程,记录他们获得并使用它的希望完整的 csv,可能会删除 LVL 代码以免费使用您的应用程序 - 这就是为什么您仍然必须混淆并仅发送请求的部分

即使校验和、使用PackageManager、apk 签名等 pp 也不会 100% 做到这一点。

但事实上,在客户端第一次下载 csv(或任何其他数据)之前,您的数据将被保存。它甚至可以保存,只要您可以信任您的用户(例如,对于内部应用程序或其他东西的有限用户信任圈,那么您应该更喜欢 androids vpn 选项来访问文件)。在那之后,破解您的应用程序并获取有价值的 csv 只是一个时间和精力的问题——问题是,是否值得任何人投入这些时间。

Justin Case 提供的附加链接,提供有关 LVL 的更多信息和链接

好好阅读所有这些链接并记住:让它变得无价值的难度无法阻止那些从成功中获取价值的破解者——我的意思是,破解某种“防破解”软件是对某些人来说更有价值,即使没有得到报酬或其他东西。

PS:对于“防破解”软件,请参阅另一个问题的答案-但如果值得的话,即使是网站及其数据也可以不断复制。

于 2013-07-23T02:37:09.683 回答
5

除了这里的所有其他答案之外,Android 开发人员博客上还有一篇题为“验证来自 Android 应用程序的后端调用”的帖子,您也应该对此感兴趣,以防您还没有遇到它。

于 2013-07-23T22:16:10.990 回答
3

如果您使用自制加密(基于众所周知的加密类型),其他应用程序可以读取您的 CSV 文件,但您的应用程序将是唯一能理解它的应用程序。为了增加加密代码的逆向工程复杂性,您可以创建一个混合JavaC(使用JNI)的加密器,当然,不要忘记使用 proguard 或其他混淆器。

于 2013-07-22T09:56:49.700 回答
3

不,这是不可能的。

正如您所怀疑的,您的应用程序始终可以被逆向工程以揭示如何获取资源。

于 2013-07-21T11:07:44.410 回答
1

如前所述,如果您的应用程序可以访问数据,那么通过一些努力,第 3 方也可以访问它。

然而,一个低技术的解决方案可能只是将 http 引用设置到您的应用程序并在您的服务器上检查它。

它只会阻止懒惰的未经授权的用户,但对于某些用例,回报/努力比可能已经足够好。

于 2013-07-22T01:58:03.583 回答