【问题标题】:Is it possible to remotely host a resource used in a Android app in such a way that it can only be used by my app?是否可以远程托管 Android 应用程序中使用的资源,使其只能由我的应用程序使用?
【发布时间】:2013-07-19 14:40:08
【问题描述】:

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

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

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

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

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

谢谢

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

【问题讨论】:

    标签: android csv encryption


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

    另一个link providing more information and links on LVL by Justin Case

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

    PS:请参阅this answer on another 问题,了解“防破解”软件 - 但如果值得的话,即使是网站及其数据也可以不断复制。

    【讨论】:

      【解决方案2】:

      除了此处的所有其他答案之外,Android 开发者博客上还有一篇标题为 "Verifying Back-End Calls from Android Apps" 的帖子,您也应该对此感兴趣,以防万一您还没有遇到。

      【讨论】:

      • 我认为这正是我一直在寻找的东西。谢谢。
      【解决方案3】:

      不,这是不可能的。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          但是,低技术解决方案可能只是将 http 引用设置为您的应用并在您的服务器上检查它。

          它只会将懒惰的未经授权的用户拒之门外,但对于某些用例,回报/努力比可能已经足够了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-14
            • 1970-01-01
            • 1970-01-01
            • 2015-05-31
            相关资源
            最近更新 更多