检查Android资产完整性

时间:2013-01-29 04:19:43

标签: java android integrity

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

有人可以轻松检索APK,修改部分内容并安装在设备上。

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

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

你有什么建议吗?

修改

这个应用程序是一个带有描述每个级别的XML文件的游戏。

4 个答案:

答案 0 :(得分:6)

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

您使用证书对应用程序进行签名。虽然他们可以删除你的,但是当把它重新组合在一起时,没有其他人可以生成相同的证书。因此,您可以在运行时检查应用程序的签名,以确保它符合您的期望。

这是一些廉价且讨厌的代码:

   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. 如何阻止某人找到检查方法并将其删除?

  3. 回答两者:你不能,不是绝对,但你可以通过混淆做得很好。免费的Proguard,但更有用的商业Dexguard,是这样做的工具。你可以考虑当前的350欧元成本;另一方面,我试图对这样受保护的应用程序进行逆向工程,除非赌注非常高,否则不值得麻烦。

    在某种程度上,您也可以自己对(1)进行模糊处理;通过一些复杂的编程方法在运行时组装签名“常量”,使其难以查找和替换。

    (2)真的是一个软件设计问题;使检查变得足够复杂或烦人。混淆只会使首先找到它更加困难。

    另外请注意,您可能需要查看Google Licensing之类的内容是否会在此区域内为您提供任何保护。我没有任何经验,所以你在那里自己。

答案 1 :(得分:2)

答案的排序虽然是否定的。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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