不懂就问, Android 离线 App 限时激活方案? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codeforyou
V2EX    Android

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

  •  
  •   codeforyou 2020-10-27 17:23:16 +08:00 13318 次点击
    这是一个创建于 1809 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如用户购买的月卡,通过邮箱和激活码请求网络激活 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  
    PRO
       2020-10-28 13:29:59 +08:00
    刚刚想到一个方案,不知道可行性怎么样。

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

    客户端使用公钥解密可以获取到上面所说的参数并进行激活,因为有激活码创建时间,所以用户需要经常调时间,甚至可以保存最近使用的时间进行验证,但是这种只针对一般用户。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6104 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 06:22 PVG 14:22 LAX 23:22 JFK 02:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86