APP上用的 http 接口被盗用了,请教有啥解决方案?

2013-11-21 10:12:12 +08:00
 adow
我们有iOS/android 的App,里面使用的一些基于Http的url接口访问数据。最近我们发现这个接口被其他人盗用了,我们现在已经做的防盗用方法是:

* 对url的参数进行sha1签名,和oauth类似,对所有参数排序,大写,然后用一个密钥进行签名,然后请求时附带这个签名;
* 在请求里增加了随机值,防止url被重复使用;
* 用于签名的密钥是在代码里的;

我们猜想他们应该是反编译了我们iOS或者android的代码,找到了密钥和签名方法,所以我们的签名方法已经没用了。

我们想下面改进的方法是:

* 使用https;
* 对签名方法进行改造,在sha1后的字符串,再用自己的方法修改里面字符的排序;
* 用c来写这个签名方法,包括密钥等,然后编译成静态库,iOS/android中来使用这个静态库;

以上只是我们想出来的解决方法,我们在这方面没有啥经验啊,不知道这些做法是否真的有效,或者有没有大幅增加破解的难度呢,也想问问大家有没有其他解决方案啊?
27343 次点击
所在节点    iDev
57 条回复
missdeer
2013-11-21 16:03:49 +08:00
https是挡不住api分析的,现在好些工具都自带一个证书装到设备上再把设备代理指向工具开的端口就行了,比如上面XD说的fiddler2,mitmproxy等等
missdeer
2013-11-21 16:06:27 +08:00
另外,比较怀疑用C写代码能增加复杂度的说法,在Android上用NDK写的代码最后也是跑在dalvik上,反编译这个字节码相对机器码来讲还是容易的多吧
tabris17
2013-11-21 16:26:01 +08:00
多线程+私有协议能大大增加破解复杂度
jimrok
2013-11-21 16:30:03 +08:00
@victor 这个简单,你只需要一台redis就可以高速记录下来。每分钟产生一个hash表,存放每个token的调用次数。一旦某个计数超出了阈值你就执行你的策略就好了。
qiongqi
2013-11-21 16:48:56 +08:00
@victor 同上,Leaky Bucket
adow
2013-11-21 19:51:52 +08:00
@jimrok
@victor
@qiongqi

如果是防止接口被他滥用,的确是可以这样做,如果他是从一台服务器上来请求我们的接口的话,大规模的调用是应该能够被发现的。可是现在他还直接做了一个Android的App(还有一个微信的应用),里面就用了我们这个接口,所以这么多设备都去单独获取token的话,我们是无法发现有啥异常的吧?
adow
2013-11-21 20:10:08 +08:00
看了大家的建议,我这样来做的话如何:

* 修改一下签名的方法使得不那么大众(现在是和OAuth里的签名方法一样的);
* 每次App启动时到服务器上去获取密钥,密钥不保证在文件里,每次都启动都不一样,鉴于即使用https访问来获取密钥也能被看出来,我们想要不要直接写一个基于tcp/ip的通信的程序,用来创建和传递密钥,而传输的数据是一种自定义格式的,也可以再次加密解密什么的。不过我们都没写过这样的程序,感觉好像挺复杂的样子啊,真的要做到这样的地步么,我还真纠结;
wwqgtxx
2013-11-21 21:52:03 +08:00
弄一个私有的协议,好好混淆一下,用c封装,apk校验不通过就不允许调用,在外侧调用jni就行了
victor
2013-11-21 22:02:21 +08:00
@adow 如果你真的確定對方偷用你的數據,不如直接一個電話過去警告對方。不行就發律師函。
VYSE
2013-11-21 22:41:48 +08:00
https协议,java客户端都是直接看通讯协议的节奏。
再防也顶多像腾讯一样搞得cracker烦到家,还是能搞出东西来。

直接封盗用ip和找律师吧
gluttony
2013-11-21 23:12:00 +08:00
@adow 用现成的SSL就行,客户端验证证书的正确性以防止中间人嗅探,app里存的证书要混淆一下。 http://www.inmite.eu/en/blog/20120314-how-to-validate-ssl-certificates-iOS-client
sprhawk
2013-11-22 13:51:20 +08:00
没有绝对的安全,我们先分析楼主的需求,楼主这个不用登录就可以使用的信息真的很重要,不能让别人访问吗?根据安全的等级,来确定要使用的策略吧

不管让app发什么,我们都很难确保app的身份,嵌在app内的信息及算法,无法100%保证不被别人获取到,所以只能提高对方拿到这个关键信息的门槛了。
gamexg
2013-11-29 21:07:09 +08:00
和对抗外挂类似,看过类似的文章。

不知道你的实际情况,比较好的办法是做一些小的标志来识别是否盗用的接口,发现是非法用户的话也不要立即报错,而是延时+随机的返回错误的数据。

小的标记可以是:
你的程序会按特定的顺序使用负载均衡的域名,如果顺序大量异常的就是非法客户端。
看似随机数或时间的参数,但其实和用户id或者其他的参数有一定的关系。
自己的程序每次请求之间的间隔必定在多少秒之间。
故意让服务器接口返回错误,你的程序会收到错误时会不更改序列号直接重发上次的请求。如果请求序列号变了就证明是非法的客户端。

可以找一些类似的东西来做标记,然后可以根据各个标记被触发的情况来锁定非法客户端。
gamexg
2013-11-29 21:20:31 +08:00
还有其他的小标记,例如你的程序必定会去取广告,或者检查更新,但是如果一个客户端没有检查版本更新就直接使用您的api了就有很大的可能性证明对方是非法客户端。

就是一个观点,从各种不引人注意的地方设套,找出非法客户端。

多弄些类似的标记就会让对方烦死的,不过你做起来也会比较麻烦了。
yinxingren
2013-12-06 19:00:32 +08:00
所有的这些动作只是加大盗用/破解的难度,但貌似也只能这么做了。
昨天crack一个android app时,发现有很多jnl调用,那个作者是写了一个库,编成了.so机器码
逆向了下能看到里面存放着的公钥,就是不去,由于个人能力有线没能搞定这个。
所以这种办法还是可以做的
onlyshit
2016-01-12 16:24:32 +08:00
@adow 可以的吧。。。
woostundy
2017-02-28 15:30:36 +08:00
@humiaozuzu HTTPS 双向验证,中间人证书就没用了。然而 app 被破解怎么都是无解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/90016

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX