V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codeforyou
V2EX  ›  Android

不懂就问, Android 离线 App 限时激活方案?

  •  
  •   codeforyou · 2020-10-27 17:23:16 +08:00 · 10138 次点击
    这是一个创建于 1490 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如用户购买的月卡,通过邮箱和激活码请求网络激活 App,30 天后自动失效,怎么做,请大家讨论一个在 Android 端校验可行的方案,谢谢!
    22 条回复    2020-10-28 13:29:59 +08:00
    OldCarMan
        1
    OldCarMan  
       2020-10-27 17:46:13 +08:00
    我没理解错的话,你说的离线应该是指脱离服务端去实现校验过期相关的业务吧,如果是,个人觉得基本不可能,除非你运行 android 客户端的设备装了一个类似原子钟之类的东西,能在本地不需要同步服务端时间就知道现在时间是什么时候,另外脱离服务端在客户端校验本身也不安全。
    chs2018
        2
    chs2018  
       2020-10-27 17:53:12 +08:00
    可以试一下 workmanager 可能能满足
    codeforyou
        3
    codeforyou  
    OP
       2020-10-27 17:59:57 +08:00
    @OldCarMan 对的,发帖的原因也想跟大家讨论本地校验时间有效性的问题,客户端是可以通过更改本地时间来欺骗校验的,但工具类 App 一般就只有激活接口是联网的,所以无法跟服务器协同来校验时间!
    codeforyou
        4
    codeforyou  
    OP
       2020-10-27 18:00:21 +08:00
    @chs2018 好的,我去搜一下,谢谢你!
    OldCarMan
        5
    OldCarMan  
       2020-10-27 18:02:27 +08:00
    @codeforyou 哈哈,所以把问题推回给产品经理:不合理,改需求!🐶
    crayygy
        6
    crayygy  
       2020-10-27 20:20:47 +08:00 via Android
    客户端改时间可以欺骗代码,但是 TLS 依然会失败,可以利用证书机制来验证时间合法性
    muzuiget
        7
    muzuiget  
       2020-10-27 20:28:09 +08:00
    一个方法,如果处理的数据本身有时间特征,可以用那些时间来判断。

    比如你有个 TODO 类的 App,程序跑起来时发现已存在的 TODO 条目创建时间晚于当前的系统时间,满足某个阈值可以判断为用户调早了系统时间,然后拒绝服务。
    Gloomyer
        8
    Gloomyer  
       2020-10-27 20:29:56 +08:00
    有个系统启动时间 手动修改时间不影响这个时间
    codeforyou
        9
    codeforyou  
    OP
       2020-10-27 20:45:01 +08:00
    @crayygy 可以详细讲解一下嘛?
    codeforyou
        10
    codeforyou  
    OP
       2020-10-27 20:45:57 +08:00
    @muzuiget 嗯,这个也不失为一个折中的方案。
    codeforyou
        11
    codeforyou  
    OP
       2020-10-27 20:48:18 +08:00
    @Gloomyer 厉害,这个也可以拿来判断用户是否更改本地时间,赞!
    imdong
        12
    imdong  
       2020-10-27 20:49:58 +08:00
    软件启动后,每隔一分钟更新一次当前时间。

    然后只要保证启动是系统时间不小于已记录时间。
    每次修改时只取已记录时间与当前系统时间更晚的一个。

    然后你的软件不要被破解修改就好了(破解估计也没必要防了)
    codeforyou
        13
    codeforyou  
    OP
       2020-10-27 20:56:33 +08:00
    @imdong 这也是一个办法,Android 现在除了混淆和加壳外,已经没有什么好的办法去防止破解了。
    crayygy
        14
    crayygy  
       2020-10-27 21:38:34 +08:00
    @codeforyou 可以搜索一下 “TLS 时间校验”,基本的原理就是,client 访问一个具有证书的 server (假设 HTTPS ),如果 client 时间和 server 时间的时间差超过一定的合法误差值的话,TLS 就会校验失败,通过这种方式可以一定程度上验证当前时间是否有被大范围篡改
    mostkia
        15
    mostkia  
       2020-10-27 22:02:07 +08:00
    如果有 GPS 权限,可以尝试通过 GPS 进行校时
    lihongming
        16
    lihongming  
       2020-10-28 01:03:21 +08:00 via iPhone
    不知道楼主到底是个什么样的应用。

    首先一点,如果你的用户是计算机专家,那你还是别指望通过技术手段来限制了,高手有的是,多考虑考虑法律手段或者其它吧。

    如果你的用户是普通人,那根本不用考虑那么多,直接用系统时间就可以了。因为你的目的不是防着所有人,而是确保有一定比例的用户付费。在自然状态下就会有这个比例的,搞得太复杂反而可能降低合法用户的体验,从而导致流失。
    f165af34d4830eeb
        17
    f165af34d4830eeb  
       2020-10-28 01:07:52 +08:00
    客户端做鉴权本身就是防君子不防小人的,就算用了加固混淆,如果破解的价值足够高也会有人慢慢逆向。建议还是把关键逻辑放在服务端。
    codeforyou
        18
    codeforyou  
    OP
       2020-10-28 10:35:28 +08:00
    @crayygy 这种方案仍需跟服务器协同哦!
    codeforyou
        19
    codeforyou  
    OP
       2020-10-28 10:36:08 +08:00
    @mostkia 方案先记下了,后续可以尝试一下。
    codeforyou
        20
    codeforyou  
    OP
       2020-10-28 10:38:13 +08:00
    @lihongming 就是一个普通的工具类 App,借 V 站宝地抛出这个问题,希望大家一起讨论,看能不能碰撞出新的解决方案。
    codeforyou
        21
    codeforyou  
    OP
       2020-10-28 10:40:19 +08:00
    @f165af34d4830eeb 很多事情都是防君子防不了小人的,有服务器协同自然更好,如果没有服务器,作为单机 App,也得想一个合适的方案,增加难度呀!
    geebos
        22
    geebos  
       2020-10-28 13:29:59 +08:00
    刚刚想到一个方案,不知道可行性怎么样。

    申请一对公钥和私钥,将激活码、激活码创建时间、激活码对应的时长(比如一个月)、以及其他的一些参数(设备识别号之类,总之要能区分设备),然后将这些参数组合起来使用私钥将这些加密。将加密后的密文当作激活码发送给用户。

    客户端使用公钥解密可以获取到上面所说的参数并进行激活,因为有激活码创建时间,所以用户需要经常调时间,甚至可以保存最近使用的时间进行验证,但是这种只针对一般用户。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3123 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 13:55 · PVG 21:55 · LAX 05:55 · JFK 08:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.