业务需求抽象一下,大概是这样:
APP 跟后台是通过 REST 交互,后台会收集 APP 统计的一些手机数据(比如在线时间)
现在的问题是:如何防止有心人通过脚本模拟这个过程制造虚假的数据?
要求不要影响 APP 端的体验,因为统计是不定时后台行为,所以验证码等方法肯定不行
提前感谢下,我想了很久,没找到合适的方案
哦,对了,方案可以从 APP 或者后台任何一方下手,都没关系
1
halfcrazy 2015-09-03 20:39:06 +08:00
敏感数据不要存客户端或者相信客户端的。服务器端做
|
2
int64ago OP @halfcrazy 可能误解我意思了,并没有敏感数据
比如 APP 的在线时间上传,我需要的效果是服务端如何才能判断收到的数据就是手机发过来的,而不是用户自行抓包分析后写脚本模拟的 |
3
qiayue 2015-09-03 21:09:49 +08:00
那就需要有一种机制可以保证你客户端发出的数据他人模仿不了。
比如说使用某种加密方式,密钥在客户端和服务器都存一份,客户端加密,服务端解密。 这样子的话,只要你能够保证你的客户端的密钥不会被人看到,那么你的请求就是可信的。 问题就转变成了如何使他人无法破解你的安装包。 |
4
Septembers 2015-09-03 21:14:30 +08:00 via Android
|
5
int64ago OP |
6
iyaozhen 2015-09-03 21:41:01 +08:00 via Android
就看楼长数据目的是干嘛,比如说是计算日活就没必要在意,因为没人刷。若是在线时长什么的可以换礼品那就只能影响用户体验在连续几个小时后弹验证码。
@int64ago 协议很复杂的话不行。现在挂 QQ 都是实体客户端直接挂 |
8
wuling 2015-09-03 21:54:55 +08:00 1
客户端加密密钥 a :
1 、客户端向服务器发请求,内容=k (a ,第一步标志,当前时间 t ,随机数 x ) 2 、服务端解密,返回内容=k (a ,第二步标志, t , x ,随机数 y ) 3 、客户端解密,如果收到时间相距正常,且 x 是之前发的 x ,则再次发送:内容=k (a ,第三步标志, t , x+y ) 4 、服务器解析,如果收到 t 、 x 、 y 都是正确的,且第三步收到的时间和 t 相差在正常范围内,那么就接受 设计一个安全协议挺难的,不过上面这个暂时还没想到什么明显的漏洞 |
12
Strikeactor 2015-09-03 22:06:42 +08:00
弄个算法每次请求算个验证码给服务器呗
只要算法不被人猜出来或是用其他方式拿到,请求就模拟不出来 |
13
lcqtdwj 2015-09-03 22:07:08 +08:00
最终还是反编译问题,如果算法没那么容易猜到的话
|
15
int64ago OP @zhicheng 考虑到抗反编译,加密模块可以考虑用 C 写,如果还是有人要反编译的话那也没办法了!毕竟小应用,应该没人会那么无聊花精力弄的
想想也不太可能从反编译的 so 里获得有效的信息,因为加密的代码可能很复杂,汇编根本不好分析 当然,如果有人能有能力直接把 so 拿过去用就另当别论了 |
16
ljbha007 2015-09-03 22:28:02 +08:00
有什么事情是 真正客户端在线的时候能做的 但是模拟的脚本做不到的事情?
|
17
ljbha007 2015-09-03 22:32:57 +08:00 1
按我的经验客户端无论怎样都有办法破解
楼主不妨从产品设计的角度考虑怎么解决这个问题 在线时间对于您的产品本身是没有任何意义的 有意义的是这段在线时间内进行的消费、参与的活动等 不妨用另外的指标来作为发奖品的参考 |
18
int64ago OP @ljbha007 还是不要过多的揣测产品的用途,“某些”数据是这个产品的核心,可以认为类似在线时间
上面的说法也只是举了个平行的例子 |
19
zhicheng 2015-09-03 22:42:45 +08:00
|
20
wy315700 2015-09-03 22:51:15 +08:00 1
零知识证明
客户端证明有那么多的在线时间。。。 客户端拥有私钥,保存公钥给服务器。 每分钟,服务器发送一个随机数给客户端,客户端把随机数和当前时间戳混合以后,使用私钥签名,发送给服务器。 |
21
neo2015 2015-09-04 09:07:08 +08:00
接口加密之类的都没用。网上刷安装活跃之类的,都用虚拟机装 APP 。本身就是走的你的接口。
虚拟机可以模拟设备,传感器, GPS ,更换 IMEI 。防不胜防。 |
22
finian 2015-09-05 18:23:23 +08:00
没有完美的方案,客户端无论如何都能被(破解)模拟出来,只能想办法增加破解的时间成本
|