离线时的Android许可证验证库

离线时的Android许可证验证库,android,google-play,android-lvl,Android,Google Play,Android Lvl,因此,我已经用我的应用程序设置了Android LVL,以检查许可。这似乎对测试帐户非常有效。问题是,如果我关闭手机的互联网连接并尝试运行该应用程序,许可检查将失败,并告诉我它未获得许可 一件事是,为什么它会告诉我应用程序没有获得许可,更重要的是,我如何让应用程序“记住”它是否获得了许可。显然,答案是,测试时不会缓存许可证,而是在上市时缓存许可证。我创建了一个小应用程序来测试这一点,它的工作 抱歉,但我也确认飞行模式导致无法依赖任何缓存。从理论上讲,如果应用程序处于联机状态,并在脱机之前ping

因此,我已经用我的应用程序设置了Android LVL,以检查许可。这似乎对测试帐户非常有效。问题是,如果我关闭手机的互联网连接并尝试运行该应用程序,许可检查将失败,并告诉我它未获得许可


一件事是,为什么它会告诉我应用程序没有获得许可,更重要的是,我如何让应用程序“记住”它是否获得了许可。

显然,答案是,测试时不会缓存许可证,而是在上市时缓存许可证。我创建了一个小应用程序来测试这一点,它的工作

抱歉,但我也确认飞行模式导致无法依赖任何缓存。从理论上讲,如果应用程序处于联机状态,并在脱机之前ping许可证服务器,那么它可能会工作。但是,如果手机长时间处于脱机状态,则没有缓存机制。看看代码。我对android提出了一个bug:

因为我的Shout n'Snap Shoutnsap.com用户已经证实了这种愚蠢的行为

我在客户端使用了一个由两部分组成的挑战来解决问题。例如:


IF LICENSED:
  PERSIST random key as LK
  PERSIST obfuscated random key as OLK
ELSE:
  if (deobfuscate(OLK) == LK) 
    GRANT ACCESS
  ELSE:
    GET LOST 

代码在这里:

您认为将许可证检查结果存储在数据库的某个位置,然后在可用的情况下使用它是一个糟糕的计划吗?实际上,我存储了一个随机生成的uid,以及它的模糊版本。如果deobfousate(uid)=uid,则可以继续。除臭的唯一方法是实际拥有代码。为了进一步保护,最好也对apk进行模糊处理。这种技术听起来不错,因为它修补了LVL中的一个漏洞,但它与存储一个布尔值作为许可证检查的结果,或者两个布尔值并进行加密完全相同。我的意思是,如果有人能将手放在两个字符串LK和0LK上,并将它们自动放入数据库(或模糊的首选项),它将通过许可证检查。仅在人们离线时添加这一点并不坏,而且,在真正的许可证检查可用时给予优先权听起来是一个很好的补充。因为这一点,我发现它根本不会缓存,因为我曾经有过用户离线且应用程序无法验证的情况。有什么建议吗?看起来是这样的:测试响应不会被缓存,但真正的响应会被缓存。。