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 条回复
adow
2013-11-21 11:48:17 +08:00
@jimrok
@tabris17 但是他也可以发送一个伪造的deviceToken到服务器上然后获取令牌啊,我是不是应该发封掉这个token的时候就封掉这个ip,这样他就不能反复获取了,如果他是从服务器上发起的话这样应该就很难继续用了吧?
jimrok
2013-11-21 12:02:00 +08:00
@adow 这个是避免不了的,还是要验证这个device的合法性,例如为这个设备推送一个token.但总能找到办法获取这些信息。根本还是要限制api的请求次数。例如同一个api,客户端1分钟内不能超过100次请求。这样盗用就没有什么价值了,换个思路,如果有人盗用你的接口,是件很美好的事情,你应该开放你的接口,使用oauth注册,让调用者很爽,这样他就离不开你了。如果换了我还求之不得让人调用,害怕我的文档写的不够好,别人不会调用。
favormm
2013-11-21 12:12:50 +08:00
这个应没有办法,因为你的接口来本就是给你客户端用的。 无论如何在你的客户端都会还原为原始数据。hack最终是可以在app内存中拿到这些原始数据与你所有的数据流操作方法。然后反汇编为高级代码,并模拟一个客户端与你服务器通信。
zhujinliang
2013-11-21 12:18:17 +08:00
改成websocket的
txlty
2013-11-21 12:22:14 +08:00
这个问题,无解。你花多长时间限制,盗用者花多长时间破解。
限制设备的话,盗用者可以凭空虚拟出无数个设备。
封IP的话。。移动的出口IP并不多。都是单个IP配大量设备。
txlty
2013-11-21 12:34:58 +08:00
很好奇,盗用者是怎么个请求频率?
是用单台服务器发请求?还是做自己的客户端 在N台手机发请求?

这个盗用请求频率,和正常用户盯着手机看的请求频率,有什么区别?
如果大于正常用户请求,那盗用者图的啥?
如果和正常用户请求频率差不多。那从你的角度看,盗用者就是个合法客户端。
yangqi
2013-11-21 12:43:36 +08:00
把手机想象成普通的客户端就行了, 你服务器总要登录然后开session, 和普通网站验证类似
adow
2013-11-21 12:43:43 +08:00
@txlty
@jimrok 盗用我们接口对我们服务器压力到不是很大,但是这里面还牵涉一些法律问题,我们和另外两家公司是签署了使用协议的,我们的产品是把A,B两家公司提供的数据进行整合,然后封装成一个独立的接口,我们服务器速度足够快,但是由于我们还要再访问A,B的数据,在请求压力大的时候肯定会给他们带来负担,所以尽可能减少对第三方公司的压力也是我们需要考虑的事情。还有,A,B 公司是授权我们的产品使用他们的数据,现在有另一家公司的产品使用了这个数据,而这个数据明显是从我们的接口上获取的,也会带来潜在的法律问题。
tabris17
2013-11-21 13:03:22 +08:00
@adow 其实这个还是看你业务来的,比如可以增加获取新标识的成本,短信验证等。还有限制两次请求间的时间间隔。
arron
2013-11-21 13:15:14 +08:00
要想完全防止,的加一个难识别的验证码,这样用户就不愿意了。
不然就真没辙的,android太好解了。只能限制下访问频率和IP,让人家采集得不那么舒服。

如果你的数据量很大。限制下频率和ip,即使人家用2000个ip去采集,一秒种采集一次,一年都采集不完的话,人家自然木有兴趣了...
arron
2013-11-21 13:15:51 +08:00
然后就是找到采集你的人或公司, 告他去...
dorentus
2013-11-21 13:46:04 +08:00
法律问题就通过法律方式解决呗。
当然你可以故意提供一些钓鱼数据来证明对方确实是在未经授权使用你们的接口。
chundong
2013-11-21 13:51:16 +08:00
@adow 如果是用device token 的请求次数来判断是否是盗用的话,建议不要封掉它,返回一些假数据回去,貌似美丽说就是这么做的,讲ANTI-SPA的那段,但是跟你的情况不太一样,他们是想封掉推广链接,http://www.infoq.com/cn/presentations/Beautiful-architecture-development-change
wupher
2013-11-21 14:22:34 +08:00
使用非对称加密如何?
用户在注册时生成一对密钥,公钥提交,私钥存于本地钥匙链。
每次关键请求以私钥签名,服务器公钥验证。
发现该客户请求异常,予以锁定,要求用户改密或其它方式来更改密钥。
比直接用sha1,AES,3DES这类,应该会好点。
愿意的话,就再挂https也行。
lvye
2013-11-21 14:38:48 +08:00
破解与否在于成本,ios再难越狱,还是会有人会去破解。
你只能多设点限制,防住一部分人,让他的成本不断加大。
victor
2013-11-21 15:13:38 +08:00
@jimrok 感谢已发送。

@adow 我觉得 @jimrok 说的:“服务器给每个token下发唯一标识的令牌。如果同一个设备同时在多个ip同时访问,果断封掉这个token。” 这个法子比较好。如果你实现了,能介绍一下怎么在服务器端判断一个令牌每分钟请求多少次吗?
adow
2013-11-21 15:15:00 +08:00
我现在想只让他的破解成本高一点

* 使用https的话,他通过伪造一个证书来解码数据有多麻烦;
* 如果我为每个设备生成私钥,然后通过https传递,本机保存在iOS的keychains里,要想把他提取出来的话难度高不高,还有Android下面有没有类似的安全保存数据的方案啊;
orzfly
2013-11-21 15:29:24 +08:00
@adow 拆 HTTPS 的其实很简单,例如 http://fiddler2.com/ 这种东西就行,几秒的事情。
tabris17
2013-11-21 15:32:16 +08:00
增加破解成本最好的办法就是采用私有通信协议
cxh116
2013-11-21 16:03:25 +08:00
@tabris17 提到的方法不错,不一定要私有协议,用http协议也可以,只是返回的数据加密. 密钥里应该包含设备token和时间等字段,生成密钥和解密最好都是用c写,这样难道应该会大很多.

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

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

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

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

© 2021 V2EX