谷歌应用内购神器Freedom原理解析

最近在做一款单机游戏的支付,由于需要在Google Play市场进行推广,所以接入了谷歌的应用内支付(In App Billing)。游戏上线后发现很多订单在谷歌后台都没有成功,但是通过游戏日志发现真实的发货了,百思不得其解后通过度娘发现一款名为"谷歌内购神器Freedom"的软件,于是下载下来尝试了一下,果真如其说明的那样不支付一分钱就成功的发货了!

真心蛋疼有木有?自己辛辛苦苦写的游戏,想要赚点外快就这样被无情的破解了,网上没找到解决办法,只能自己研究了,终于被我给找到了问题,在此把这个过程分享出来,希望对android开发的各位同学们有所帮助,在开发android应用的时候要多注意安全问题。好了,废话不多说,直接上图:

这个是安装了Freddom后手机的hosts文件,可以看到访问谷歌的域名已经被篡改,127.175.41.187等同于127.0.0.1,因此大胆猜想Freedom在手机上开了一个简单的http服务,目的是用来拦截和篡改客户端跟谷歌服务器的交互内容,流程大家自行脑补(其实我还不会画图哭)。

好了,通过上面这一步,Freddom可以任意篡改谷歌的支付结果了,当然它要做的很简单就是把谷歌支付结果中的支付状态修改为0即可(0表示支付成功)。谷歌在一开始就想到了这些问题,所以在接口中的支付结果回调是带有RSA签名的,目的就是为了防止类似这样的篡改(这里就不详细讨论RSA算法了)。那么问题就来了,我的应用中是有做RSA验签的呀,难道Freedom牛逼到能够破解RSA算法么?这个想法一闪而过,立刻被我否决,那么它是如何绕过RSA验签的呢,我决定进行单步调试,大家注意看下面的RSA验签代码:

     public static boolean verify(PublicKey publicKey, String signedData, String signature) {
        Signature sig;
        try {
            sig = Signature.getInstance(SIGNATURE_ALGORITHM);
            sig.initVerify(publicKey);
            sig.update(signedData.getBytes());
            if (!sig.verify(Base64.decode(signature))) {
                Logs.e(TAG, "Signature verification failed.");
                return false;
            }
            return true;
        }catch (Exception e) {
            Logs.e(TAG, "Signature exception");
        }
        return false;
    }

当debug到上面的代码的时候,我尝试修改了signedData里边的值,按道理应该验签不过才对,但是结果很神奇,竟然验签通过了!这才是Freedom神奇的地方,它不仅篡改了应用与谷歌服务器的网络信息,同时篡改了应用与java底层的api函数调用结果,至于它如何做到后者的,恕我一个刚学android的小菜鸟无法解答。


好了,知道Freedom的原理后那么解决办法就很简单了,方法很多:

1.把rsa签名的校验交给服务器来做,客户端不做任何验证,但前提是客户端和服务端的交互是安全的(参考第一步,你的服务端信息是否可以被轻易篡改呢)。

2.对应没有服务端的单机应用,可以不是要java提供的rsa验签算法,自己实现RSA验签的算法,这样就不会被Freedom给篡改验签结果。

3.还有一个更简单的处理办法,就是每次验签之前先用假的数据尝试去验签,如果验签通过了,表示API被篡改了,直接验签不通过,当不通过的时候才用真实的数据去验签(该方法有风险,慎用)。

          由于常年做服务端开发,刚接触android就遇到如此棘手的问题,因此也得到一点心得:所谓道高一尺,魔高一丈,客户端任何信息都应保持怀疑,凡事涉及到验证类型的事情一定要慎重,三思而行!








评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值