V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
codeforyou
V2EX  ›  Android

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

  •  
  •   codeforyou · Oct 27, 2020 · 14600 views
    This topic created in 2008 days ago, the information mentioned may be changed or developed.
    比如用户购买的月卡,通过邮箱和激活码请求网络激活 App,30 天后自动失效,怎么做,请大家讨论一个在 Android 端校验可行的方案,谢谢!
    22 replies    2020-10-28 13:29:59 +08:00
    OldCarMan
        1
    OldCarMan  
       Oct 27, 2020
    我没理解错的话,你说的离线应该是指脱离服务端去实现校验过期相关的业务吧,如果是,个人觉得基本不可能,除非你运行 android 客户端的设备装了一个类似原子钟之类的东西,能在本地不需要同步服务端时间就知道现在时间是什么时候,另外脱离服务端在客户端校验本身也不安全。
    chs2018
        2
    chs2018  
       Oct 27, 2020
    可以试一下 workmanager 可能能满足
    codeforyou
        3
    codeforyou  
    OP
       Oct 27, 2020
    @OldCarMan 对的,发帖的原因也想跟大家讨论本地校验时间有效性的问题,客户端是可以通过更改本地时间来欺骗校验的,但工具类 App 一般就只有激活接口是联网的,所以无法跟服务器协同来校验时间!
    codeforyou
        4
    codeforyou  
    OP
       Oct 27, 2020
    @chs2018 好的,我去搜一下,谢谢你!
    OldCarMan
        5
    OldCarMan  
       Oct 27, 2020
    @codeforyou 哈哈,所以把问题推回给产品经理:不合理,改需求!🐶
    crayygy
        6
    crayygy  
       Oct 27, 2020 via Android
    客户端改时间可以欺骗代码,但是 TLS 依然会失败,可以利用证书机制来验证时间合法性
    muzuiget
        7
    muzuiget  
       Oct 27, 2020
    一个方法,如果处理的数据本身有时间特征,可以用那些时间来判断。

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

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

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

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

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

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

    客户端使用公钥解密可以获取到上面所说的参数并进行激活,因为有激活码创建时间,所以用户需要经常调时间,甚至可以保存最近使用的时间进行验证,但是这种只针对一般用户。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1447 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 23:57 · PVG 07:57 · LAX 16:57 · JFK 19:57
    ♥ Do have faith in what you're doing.