1
OldCarMan 2020-10-27 17:46:13 +08:00
我没理解错的话,你说的离线应该是指脱离服务端去实现校验过期相关的业务吧,如果是,个人觉得基本不可能,除非你运行 android 客户端的设备装了一个类似原子钟之类的东西,能在本地不需要同步服务端时间就知道现在时间是什么时候,另外脱离服务端在客户端校验本身也不安全。
|
2
chs2018 2020-10-27 17:53:12 +08:00
可以试一下 workmanager 可能能满足
|
3
codeforyou OP @OldCarMan 对的,发帖的原因也想跟大家讨论本地校验时间有效性的问题,客户端是可以通过更改本地时间来欺骗校验的,但工具类 App 一般就只有激活接口是联网的,所以无法跟服务器协同来校验时间!
|
4
codeforyou OP @chs2018 好的,我去搜一下,谢谢你!
|
5
OldCarMan 2020-10-27 18:02:27 +08:00
@codeforyou 哈哈,所以把问题推回给产品经理:不合理,改需求!🐶
|
6
crayygy 2020-10-27 20:20:47 +08:00 via Android
客户端改时间可以欺骗代码,但是 TLS 依然会失败,可以利用证书机制来验证时间合法性
|
7
muzuiget 2020-10-27 20:28:09 +08:00
一个方法,如果处理的数据本身有时间特征,可以用那些时间来判断。
比如你有个 TODO 类的 App,程序跑起来时发现已存在的 TODO 条目创建时间晚于当前的系统时间,满足某个阈值可以判断为用户调早了系统时间,然后拒绝服务。 |
8
Gloomyer 2020-10-27 20:29:56 +08:00
有个系统启动时间 手动修改时间不影响这个时间
|
9
codeforyou OP @crayygy 可以详细讲解一下嘛?
|
10
codeforyou OP @muzuiget 嗯,这个也不失为一个折中的方案。
|
11
codeforyou OP @Gloomyer 厉害,这个也可以拿来判断用户是否更改本地时间,赞!
|
12
imdong 2020-10-27 20:49:58 +08:00
软件启动后,每隔一分钟更新一次当前时间。
然后只要保证启动是系统时间不小于已记录时间。 每次修改时只取已记录时间与当前系统时间更晚的一个。 然后你的软件不要被破解修改就好了(破解估计也没必要防了) |
13
codeforyou OP @imdong 这也是一个办法,Android 现在除了混淆和加壳外,已经没有什么好的办法去防止破解了。
|
14
crayygy 2020-10-27 21:38:34 +08:00
@codeforyou 可以搜索一下 “TLS 时间校验”,基本的原理就是,client 访问一个具有证书的 server (假设 HTTPS ),如果 client 时间和 server 时间的时间差超过一定的合法误差值的话,TLS 就会校验失败,通过这种方式可以一定程度上验证当前时间是否有被大范围篡改
|
15
mostkia 2020-10-27 22:02:07 +08:00
如果有 GPS 权限,可以尝试通过 GPS 进行校时
|
16
lihongming 2020-10-28 01:03:21 +08:00 via iPhone
不知道楼主到底是个什么样的应用。
首先一点,如果你的用户是计算机专家,那你还是别指望通过技术手段来限制了,高手有的是,多考虑考虑法律手段或者其它吧。 如果你的用户是普通人,那根本不用考虑那么多,直接用系统时间就可以了。因为你的目的不是防着所有人,而是确保有一定比例的用户付费。在自然状态下就会有这个比例的,搞得太复杂反而可能降低合法用户的体验,从而导致流失。 |
17
f165af34d4830eeb 2020-10-28 01:07:52 +08:00
客户端做鉴权本身就是防君子不防小人的,就算用了加固混淆,如果破解的价值足够高也会有人慢慢逆向。建议还是把关键逻辑放在服务端。
|
18
codeforyou OP @crayygy 这种方案仍需跟服务器协同哦!
|
19
codeforyou OP @mostkia 方案先记下了,后续可以尝试一下。
|
20
codeforyou OP @lihongming 就是一个普通的工具类 App,借 V 站宝地抛出这个问题,希望大家一起讨论,看能不能碰撞出新的解决方案。
|
21
codeforyou OP @f165af34d4830eeb 很多事情都是防君子防不了小人的,有服务器协同自然更好,如果没有服务器,作为单机 App,也得想一个合适的方案,增加难度呀!
|
22
geebos 2020-10-28 13:29:59 +08:00
刚刚想到一个方案,不知道可行性怎么样。
申请一对公钥和私钥,将激活码、激活码创建时间、激活码对应的时长(比如一个月)、以及其他的一些参数(设备识别号之类,总之要能区分设备),然后将这些参数组合起来使用私钥将这些加密。将加密后的密文当作激活码发送给用户。 客户端使用公钥解密可以获取到上面所说的参数并进行激活,因为有激活码创建时间,所以用户需要经常调时间,甚至可以保存最近使用的时间进行验证,但是这种只针对一般用户。 |