【问题标题】:Check Android Assets Integrity检查 Android 资产完整性
【发布时间】:2013-01-12 14:12:33
【问题描述】:

在我的文件夹 assets/data 中,有很多 XML 文件包含我的应用程序的静态数据。

检索 APK、修改其中的一部分并安装到设备上真的很容易。

我想通过检查我的assets/data 文件夹的完整性来防止用户更改我的静态数据。

最初我正在考虑使用 MD5 checksum,但对于我将拥有的文件数量 (50-100) 来说,它可能太慢了。

你有什么建议吗?

编辑:

此应用是一个游戏,其中包含描述每个级别的 XML 文件。

【问题讨论】:

    标签: java android integrity


    【解决方案1】:

    我将介绍如何有效地防止修改和重新打包,而不是如何单独保护资产,尽管您最终可以应用相同的技术来加密它们。它并不完美,但您可以使修改变得更加困难。

    您使用证书签署应用程序。尽管他们可以删除您的证书,但在将其重新组合在一起时,没有其他人可以出示相同的证书。因此,您可以在运行时检查应用程序的签名,以确保它符合您的预期。

    这里有一些廉价而讨厌的代码来做到这一点:

       PackageManager pm = context.getPackageManager();
    
       PackageInfo info = pm.getPackageInfo( context.getPackageName(), PackageManager.GET_SIGNATURES );
    
       if ( info.signatures[ 0 ].toCharsString().equals( YOUR_SIGNATURE ) )
       {
         //signature is OK
       }
    

    其中 YOUR_SIGNATURE 是一个常量,通过在签名应用上运行此代码获得。

    现在,您已经暗示了两个剩余的问题:

    1. 如何阻止有人只是修改源代码中的常量以匹配他们的证书,然后重新打包并重新签署应用程序?

    2. 如何阻止有人找到检查方法并将其删除?

    两者都回答:你不能,不是绝对,但你可以通过混淆做得很好。免费的 Proguard,但更有用的是商业的 Dexguard,是执行此操作的工具。您可以拒绝后者目前的 350 欧元费用;另一方面,我曾尝试对受此类保护的应用程序进行逆向工程,除非风险非常很高,否则不值得麻烦。

    在一定程度上,您也可以自己对 (1) 进行混淆;通过一些复杂的编程方法在运行时组装签名“常量”,这使得查找和替换变得困难。

    (2) 确实是软件设计问题;使取消支票变得足够复杂或烦人。首先,混淆只会使查找变得更加困难。

    进一步说明,您可能想看看像 Google Licensing 这样的东西是否在这方面为您提供任何保护。不过我没有任何经验,所以你自己在那里。

    【讨论】:

    • 无论您做什么,切勿将您的签名密钥放入您的代码中!这将允许有意愿的人解压您的 apk,并使用您的相同签名密钥重新打包。
    • 请重新阅读代码。这不是签名密钥,而是它的签名。如果可以从证书中获取签名密钥,我们都会遇到更大的问题。为了清楚起见,我已经编辑了答案的措辞。
    • 明白了。我没有投票。允许黑客查看签名(如果他们检查了所有混淆代码)是否有利于辞职或重新发布应用程序?
    • 不,因为证书的安全性来自用于生成它的私钥,它永远不会暴露。您可以针对任何应用程序运行上述代码并获得无用的签名。这里唯一明显的漏洞是您可能会设法产生冲突攻击,即产生具有相同签名的不同证书。我希望这种可能性足够小!
    • +1 你肯定已经通过了,并且知道你的东西!
    【解决方案2】:

    虽然答案是否定的,但还是有点答案。

    如果此人拥有您的 apk 并且已对其进行解码,那么即使您使用了校验和,他们也可以使用新的校验和更新代码部分。我不认为你能赢得这个。您可以投入大量精力来保护它,但如果您假设有人可以获取和修改 apk,那么他们也可以撤消保护。在我的商业内容上,我只是尝试使解码不明显但不是防弹的。我知道任何事情都不值得努力甚至是不可能的。

    【讨论】:

    • 我知道没有完整的解决方案。但是,可以直接在 APK 文件中修改资产中的 XML 文件。这是我要防止的。暂时修改代码确实比较复杂。
    • 我只是想让别人不要在这个话题上花费太多时间。
    • 是的,我在询问社区之前两次放弃了这个想法。我只是想确保不会错过一个出色的解决方案。
    【解决方案3】:

    也许您可以将 xml 文件压缩并放在 assets/data 文件夹中;然后对该.zip 进行校验和。在第一次运行时,您可以解压缩文件以获取 .xml 布局。请参阅 Unzip file from zip archive of multiple files using ZipFile class 解压缩档案。

    【讨论】:

      【解决方案4】:

      可能最可靠的方法是在应用程序启动时从服务器下载关卡 XML 数据,并检查关卡文件的时间戳和大小。这也让您可以随时间提供关卡数据的更新。当然,这意味着您需要增加托管服务器的费用,这可能是另一个问题。

      【讨论】:

      • 好主意,但它需要网络连接。我的游戏目前不需要它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多