如何使一个“安卓解锁”应用程序更安全的对付cookies?

对于我的应用程序的付费版本,我正在select解锁器应用程序路由,因为它很容易实现,允许开发人员控制台中的个人统计信息,但主要是因为我不需要维护2个代码库(一个用于免费版本和另一个为付费版本)。 即使我使用了CVS(我也这样做),继续合并function和错误修复仍然是一件痛苦的事情。 解锁器应用程序是更容易实施总体…

但是这带来了严重的缺点,超出安全检查真的很容易。 除非我在这里失去了一些东西。

无论我做什么,这样的实现总是会导致一个简单的, if这样的话:

 if(Program.isPremiumVersion()) { // Remove ads... } 

isPremiumVersion()方法是负责检查付费解锁器应用程序安装的所有工作,如果证书匹配和所有的东西。 是的,解锁的应用程序受到LVL的保护(尽pipe我已经阅读了几篇文章,提到LVL是不安全的,但现在不是这一点)。 但最终,无论isPremiumVersion()获取的代码多么复杂,它总是会返回truefalse值。

覆盖这样的安全特性只是对代码进行逆向工程,并使其始终返回true 。 不是吗? 我们怎样才能保护我们的Android应用程序呢? 是的,代码被ProGuard混淆了。 不过,对于有足够熟练的人来说不应该太难。

请注意,我并不是想要打击cookies,我们根本无法取胜。 我不会为此失眠,在“完美的解决scheme”上浪费无数的时间。 我只是想找一个方法让它更安全一些。 至less在理论上这似乎很容易破解。 我错了吗?

任何想法,以提高这种function的安全性

Solutions Collecting From Web of "如何使一个“安卓解锁”应用程序更安全的对付cookies?"

有没有简单的方法来解决这个问题。

你必须尝试掩盖它。 这里有一些提示:

技巧1:返回布尔值太明显了。 尝试返回一个值(例如int)。 然后,使用比较来查看这是否是有效的已知返回值。

例如:获取一个string的md5,其中包含可以判断是否溢价的东西。 假设你在每个应用上都有一个静态的最终string。 也许一个md5以9开始,另一个以1开始。在这种情况下,计算md5,看看它是否大于一个“随机”数字,你知道它是在另外两个数字之间。 说“premium”的md5是987,“free”的md5是123.你可以计算md5并把它与456比较。

提示2 – 更好:每次重复一些代码并使用不同的值(而不是456)! 希望这会使解码混淆代码更加困难。

我知道所有这些检查将最终映射到一个布尔值( if(1 > 2)将被评估为if(true) ),但是应该更难以逆向工程您的应用程序。

提示3 :不要在最明显的地方运行“isPremium”检查。 例如,不要在启动应用程序时进行检查,因为这是最明显的地方。 如果你想拥有取决于应用程序版本的条件逻辑,可能很难避免某些明显的斑点,但在这里尽力而为!

技巧4:构build和混淆你的应用程序。 针对您的apk运行逆向工程工具。 阅读并看看它看起来如何。

最后 ,每天在早餐时观看Google IO演示文稿: 使用许可证validation库,应用内结算和App Engine来阻止盗版和阻止吸血鬼

[编辑 – 一些更多的技巧]

提示6:尝试使用您使用的代码来检查完全有效的地方。 这可能会掩盖你在那里真正做的事情。 这可能包括调用代码来检查这是哪个版本的应用程序,但没有做任何有意义的事情。 或者,在我之前的例子中,将md5与012或999进行比较,仅仅是为了稀释这些variables的实际使用。

技巧7:不要依赖单个string,而可以考虑在运行时构buildstring。 决赛和统计也可能引起太多的关注,所以避免这些可能是一件好事。

提示8:不要使用google教程中提供的LVL代码。 修改它。 很多!

注意:我不确定这些提示中的任何一个是否会带来很大的变化,但是至less让cookies的生活变得更难。

你可能已经看到了这个,但是这里有一些代码来实现你在说什么:

http://groups.google.com/group/android-developers/browse_thread/thread/4ad3d67f735f16d7/948b4f9eee2490a3?pli=1

它会检查自由和解锁器应用程序上的签名是否相同。 因此,不可能有人用正确的名字人工创build应用程序,因为签名会有所不同。 但是,人们仍然可以将apk从手机中分离出来并发布。 解决这个问题的唯一方法就是使用某种服务器authentication,但这会增加成本和复杂性。