在我的文件夹assets/data
中,有很多 XML 文件包含我的应用程序的静态数据。
某人检索 APK、修改其中的一部分并安装在设备上真的很容易。
我想通过检查我的assets/data
文件夹的完整性来防止用户更改我的静态数据。
最初我正在考虑使用MD5 checksum,但对于我将拥有的文件数量(50-100)来说它可能太慢了。
你有什么建议吗?
编辑:
这个应用程序是一个带有描述每个级别的 XML 文件的游戏。
在我的文件夹assets/data
中,有很多 XML 文件包含我的应用程序的静态数据。
某人检索 APK、修改其中的一部分并安装在设备上真的很容易。
我想通过检查我的assets/data
文件夹的完整性来防止用户更改我的静态数据。
最初我正在考虑使用MD5 checksum,但对于我将拥有的文件数量(50-100)来说它可能太慢了。
你有什么建议吗?
编辑:
这个应用程序是一个带有描述每个级别的 XML 文件的游戏。
我将描述如何有效地防止修改和重新打包,而不是如何单独保护资产,尽管您最终可以应用相同的技术来加密它们。它是不完美的,但是您可以使修改变得更加困难。
您使用证书签署应用程序。尽管他们可以删除您的证书,但在将其重新组合在一起时,没有其他人可以出示相同的证书。因此,您可以在运行时检查应用程序的签名,以确保它是您所期望的。
这里有一些廉价和讨厌的代码来做到这一点:
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 是一个常量,通过在签名的应用程序上运行此代码获得。
现在,您已经暗示了两个剩余的问题:
你怎么能阻止某人只是修改源代码中的常量以匹配他们的证书,然后重新打包和重新签名应用程序?
你怎么能阻止有人找到检查方法并将其删除?
对两者的回答:你不能,不是绝对的,但你可以通过混淆来做得很好。免费的 Proguard,但更有用的是商业的 Dexguard,是执行此操作的工具。您可以拒绝后者目前的 350 欧元费用;另一方面,我曾尝试对像这样受保护的应用程序进行逆向工程,除非风险非常高,否则不值得麻烦。
在某种程度上,您也可以为(1)自己做混淆;通过一些复杂的编程方法在运行时组装签名“常量”,这使得查找和替换变得困难。
(2) 确实是软件设计问题;使取消支票变得足够复杂或烦人。首先,混淆只会使查找变得更加困难。
作为进一步的说明,您可能想看看像Google 许可这样的东西是否在这方面为您提供任何保护。不过我没有这方面的经验,所以你自己在那里。
一个答案,虽然它是否定的。
如果此人拥有您的 apk 并对其进行了解码,那么即使您使用了校验和,他们也可以使用新的校验和更新代码部分。我不认为你能赢得这个。您可以投入大量精力来保护它,但如果您假设有人可以获取和修改 apk,那么他们也可以撤消保护。在我的商业内容上,我只是尝试使解码不明显但不是防弹的。我知道任何事情都不值得努力甚至是不可能的。
也许您可以压缩 xml 文件并将其放在 assets/data 文件夹中;然后对该.zip 进行校验和。在第一次运行时,您可以解压缩文件以获取 .xml 布局。请参阅使用 ZipFile 类从多个文件的 zip 存档中解压缩文件以解压缩存档。
可能最可靠的方法是在应用程序启动时从服务器下载关卡 XML 数据,并检查关卡文件的时间戳和大小。这也让您可以随时间提供关卡数据的更新。当然,这意味着您需要增加托管服务器的费用,这可能是另一个问题。