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中来使用这个静态库;

以上只是我们想出来的解决方法,我们在这方面没有啥经验啊,不知道这些做法是否真的有效,或者有没有大幅增加破解的难度呢,也想问问大家有没有其他解决方案啊?
26706 次点击
所在节点    iDev
57 条回复
min
2013-11-21 10:32:57 +08:00
服务器端怎么知道那些请求是来自盗用者的呢?
kstsca
2013-11-21 10:42:07 +08:00
矛与盾 基本无解
nocoo
2013-11-21 10:43:19 +08:00
akira
2013-11-21 10:51:50 +08:00
访问接口的时候,带上用户信息,例如用户id,udid之类的。
用户id不合法的禁止调用。
然后给每个用户设定个阀值就行了。

ps: 任何只依赖app本地代码的功能,都是可逆可破的。时间差别而已
Livid
2013-11-21 10:54:31 +08:00
如果一开始就设计成 https 的,那么别人就更难看到 URL 了。
sun391
2013-11-21 10:57:09 +08:00
所有请求多加个验证信息 比如说是 userid+timestamp 对称加密
密钥写在c里

不过这也只是增加了破解难度而已,索性就在规则上限制,一个userid只能调用X次/天,user创建时+验证码、邮箱验证(总之不能让他全自动注册)
wxstorm
2013-11-21 11:00:04 +08:00
https只能保证网络上数据被截获了是破解不了的。
但是如果客户端被破解,https有啥用。。。
adow
2013-11-21 11:05:26 +08:00
@akira
@min

恩,现在我们在请求时没有用户身份信息的,App也不需要用户登录,签名时的密钥都是同一个,保存在代码里的,所以暂时也无法确定盗用者的身份。要加上身份这一层就需要多添加额外的流程了,比如注册什么的,或者简单点就是用推送的deviceToken来标识身份。
binux
2013-11-21 11:13:26 +08:00
假如你的app是一个黑盒,黑盒的输入是用户操作,中间有个过程是将用户操作编码加密发送出去。
我都拿到你的app了,再不济,难道不能把用户操作去掉,直接黑盒使用编码加密功能吗?
adow
2013-11-21 11:19:24 +08:00
@binux 是啊,我也这么想,即使我用c封装成静态库,你反编译后看的也许麻烦点,不过我要是直接用这个库进行编码岂不是更容易了,越想越绕了,难不成真的无解么。

对了,我看到别人说,反向obj-c的工程貌似要难点么,而反向Android的java代码却似乎比较容易读。我们的Android项目是外包给另一个公司做的,我们想让他混淆一下java的代码,他们说项目涉及的模块还有第三方包太多,没法做混淆了,所以我才想到用c写一个,然后给iOS/Android用。
wxstorm
2013-11-21 11:20:16 +08:00
我觉得比较现实点的做法是 限制每个http接口在同一个客户端上的访问次数,比如同IP一天只能访问多少次,超过了要么就禁掉,要么弹个图片验证码让输入。

走加密之类的,只要你的密钥存在一个可以发现的地方,都是可破解的~~
humiaozuzu
2013-11-21 11:21:06 +08:00
@Livid 加一个证书中间人攻击一样拿API数据
icyalala
2013-11-21 11:21:29 +08:00
假设。。Android版本你已经在编译出了C的链接库,然后用Java调用。。
那黑客直也可以直接用.so文件来调用接口啊。。。

就是说,这些实际上都是用户的行为,只要黑客有心,你是很难区分出来的。。
你只能在服务端验证参数是否合法、用户行为是否正常、调用频率是否OK.做好监控足够了。
binux
2013-11-21 11:22:46 +08:00
@humiaozuzu 比如ingress就是这么被破解的
humiaozuzu
2013-11-21 11:29:49 +08:00
@binux 最近一直在分析各种 API 玩,Protobuf/HTTPS 都是很容易分析的
同步推的 API 加密没找到方法
jimrok
2013-11-21 11:37:50 +08:00
给你的建议,设备要注册,将device的token上送到服务器去。服务器给每个token下发唯一标识的令牌。如果同一个设备同时在多个ip同时访问,果断封掉这个token。
tabris17
2013-11-21 11:44:00 +08:00
每个设备或者客户端都需要唯一标识,每次请求都要发送这些标识,只要封掉那些异常请求的标识就行了。比如单位时间发送过多请求
darasion
2013-11-21 11:44:26 +08:00
我觉的可以这样:
1. 升级 app,升级接口,旧接口保留
2. 旧接口一直保留,但使用假冒的数据,做的像真的一些。

如果没有人注意你升级了接口,那利用你接口的人就懒得更新它的东西了。
Sfan
2013-11-21 11:45:51 +08:00
用c来写这个签名方法,包括密钥等,然后编译成静态库,iOS/android中来使用这个静态库;
我觉得还是这个可靠...
sunwenjun
2013-11-21 11:47:33 +08:00
@humiaozuzu , 没有服务器的证书 https也能破解?

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

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

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

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

© 2021 V2EX