前段时间有篇比较火的新闻,说的是女黑客破解了几款共享单车的 app,这次我也给大家带来一不小心破解了市面上两款用蓝牙开锁的共享单车的经历。
同学们,我回来了。
上次有心研究了一下共享单车,说是有点创业的想法。写了一篇文章《共享单车上的智能锁,做出来有多难?》记录下心得和看法,没想到获得了不少的关注。既然大家都资瓷我,那我也不得不围绕共享单车这个话题再更新一下,毕竟写文章有人关注也是成就感满满的一件事。
蓝牙解锁的开锁原理
我记得上篇文章中给大家介绍过各类共享单车的基本开锁原理。有短信开锁、GPRS 流量开锁、蓝牙 + GPRS 二合一开锁这几种方式,唯独漏了一个单纯使用蓝牙的开锁方式没有介绍,而单纯用蓝牙开锁的共享单车品牌,在市面上还是有几款的。
讲述我如何破解之前,我先来给大家说说共享单车单纯只靠蓝牙开锁的开锁原理。
手机扫码后,服务器会通过流量4G网络连接用户手机,当业务层校验完毕,手机会下载服务器发过来的加密包,再将包通过蓝牙发送到锁中进行解锁。
说得容易理解一点,就是用户的手机先发个请求开锁的消息到服务器,服务器再把开锁密码发到手机,手机用这个开锁密码通过手机蓝牙,与锁内的蓝牙配对后开锁。整个过程里面,用户的手机充当着一个中间人的角色,连接服务器与单车,单车锁内部是不会与服务器直接联系的(废话,锁内只有蓝牙怎么连得上服务器建立通讯)。
破解全过程
知道这个原理就可以开始我的破解表演了(๑•̀ㅂ•́)و✧。
首先我下载了市面上我知道的两款只用蓝牙开锁的共享单车 APP,之后对其进行破解。破解第一步是反编译应用,静态分析代码,对关键函数进行挂钩动态分析流程,关键是要看看它具体是怎样进行开锁操作的。(破解过程就不能细说了,我是在不传播、不利用漏洞的前提下破译,反编译有可能造成违法哦,同学们不要模仿)
最后发现一如之前的推测所料,单纯使用蓝牙的共享单车开锁时,用户的手机既要和服务器交互,又需要和锁上的蓝牙交互,这个时候破解思路就出来了:我可以按照整个开锁逻辑流程,自己模拟服务器请求以及和锁上的蓝牙交互。
破解X鸣单车
和服务器交互的主要目的是为了拿到一个 token,这里可以简单的理解为共享单车上每辆车的一个密码钥匙吧。手机获得这个密码之后用蓝牙连接单车就可以完成开锁。成功了之后,我发现市面上的某一共享单车品牌X鸣,它三代之前的锁的用的 token 每一辆车都相同。
所以,在获得了车的密码钥匙后,以后我就可以不通过服务器直接开锁全部单车,而服务器根本不会知道我已经解锁了。简直了,跟 ofo 被知道了机械密码可以无限次使用一样。如果用 ofo 类比的话,X鸣的锁相当于所有车的密码都一样,只要知道一辆车的密码就可以开所有车锁。我是用一把“钥匙”(一个 token)就可以开锁所有这个品牌的单车。
如上图所示,我先扫描附近的蓝牙锁,理论上可以把周围的所有使用蓝牙开锁的单车都扫描出来,也可以手动结束扫描。扫描结束后点击对设备进行开锁就可以了,不需要经过它的服务器。因为X鸣三代后开锁的算法变了,所以我在应用中增加扫描单车二维码的功能,通过扫描来确定这台车是第几代,根据单车不同的版本来确定开锁算法开锁。(说得比较复杂,总之就是通过破解开锁算法,X鸣所有的锁我都能开)
关键是,因为所有的车都可以用一个 token 来开,所以我只要连接蓝牙发送开锁指令,十米内的所有X鸣单车的锁就全开了。。。
破解X拜单车
首先这个X拜不是摩拜,是另一款以绿色为主题、蓝牙开锁的单车。
X拜单车与上面说的X鸣单车使用的一样的锁,原理也是一样的。手机扫码后,向服务器发起开锁请求,然后手机作为中转方把数据通过蓝牙从服务器发往锁,解锁成功后,锁通过手机把数据返回给服务器。
但是这个品牌的单车开锁方式稍稍提高了安全性,每一辆车的一个密码不一样,并且同一辆车开锁前后的密码也不一致,所以这个密码生成算法是在服务端进行的,客户端不能知晓,导致客户端每次开锁必须经过服务器。
所以破解的关键在于我需要服务器给我发送开锁的 token,又要让服务器认为我没开单车达到破解(骑车不花钱)的目的。破解过程也很简单,我用手机向服务器发送一个开锁请求,服务器发把电子密码发过来,由手机蓝牙发送开锁指令到智能锁,这样我已经可以解锁单车了。之后我故意把手机客户端解锁成功的消息丢掉,服务器收不到数据包,就会以为解锁失败,自然也不会扣费了。开锁的图我就不贴了,跟上面一样。
为什么是蓝牙锁?
或许大家会有疑问,我为什么只破解蓝牙锁?原因很简单,因为它不安全,容易被破解。我之前的文章提到过,智能锁是共享单车的核心,而单纯用蓝牙开锁的共享单车品牌,只可以算是“伪智能”。说白了,不直接联网的单车锁根本不能做到智能化,也满足不了大部分用户的体验,蓝牙锁就是如此。写这篇文章的目的也是告诫广大有意创业共享单车的同学(比如我),单纯用蓝牙方式来开锁的共享单车根本没有出路,以下说说我自己的见解。
蓝牙锁无力驾驭共享单车的运营
1.蓝牙锁不安全
这个理由非常明显,因为我都已经破解了嘛。这里强力吐槽下已经投放落地的几款共享单车,一个 token 就能轻松破译解锁,本质上与机械锁没任何区别,只不过破解的方式更高级一点而已。如果用户愿意,大可以用我刚刚的方法去解锁。可能会有人说:我没有你的技术我破解不了啊。嘻嘻,其实破解那个原理很简单,普通用户也轻松可以做到。
只要在开锁之后马上关掉蓝牙,让服务器获取不到开锁信息,就能一次开锁无限使用。反正单车的定位信息也是通过用户手机发送的,服务器最后连谁开的锁,车子在哪都不知道。
2.蓝牙锁没有定位
蓝牙锁的定位是通过手机发送车辆位置的,自身并与服务器建立连接。没有GPS跟踪,无法精准定位维修车辆。跟我们吐槽很多次用机械锁的 ofo 一模一样,没有定位有什么劣势我已经不想在复述了,你们可以参考下每天多少小黄车被丢弃,被盗。
这也是我破解蓝牙锁的原因之一,如果是带定位的单车,我破解之后服务器获取车子定位就知道被破解了,而现在它被破解之后,想找回来已经是不可能了。蓝牙单车陷入了跟机械锁单车的僵局,连单车被盗、丢失都不知道,运维成本也相应增加,算什么智能。
蓝牙锁极度影响用户体验
众所周知,关于共享单车的用户体验体现在两个方面:一是开锁时间、二是舒适程度。单车骑起来的舒适程度见仁见智,我不作探究,主要是单车的开锁时间的问题。
我的城市里有多款共享单车品牌,楼下也是慢慢排满了各种颜色的单车。我观察到,每天的下班时间,橙色的(摩拜)和黄色的(ofo)都不见了,只剩下那两款用蓝牙锁的共享单车还剩一整排都没人骑。我开始觉得奇怪,共享单车用户忠诚度不会很高,而大家都有骑车的需求,为什么没人骑呢?后来我想到了,用户不是不想骑,是骑不了,没有比这个这更坑爹的了。
原因是除去苹果,不同的手机厂商的蓝牙芯片版本兼容性太差了。比如说我用的华为手机上的蓝牙能配对成功,但你用小米就不一定了。现在市场上还有这么多厂商牌子的安卓手机,因为采购的蓝牙芯片差异太大,有时候同样是一个牌子的手机,不同型号都有兼容问题。(不是随口乱说的,我借了同事、家人共6台的安卓手机测试楼下的X鸣单车、X拜单车,只有两个开锁成功)
所以别说照顾体验缩短开锁时间了,现在要求已经降到不管多少时间,我只要别开锁失败就好了。而单纯用蓝牙锁的共享单车连这一点都做不到,何来用户忠诚?用户很可能试过一两次失败后就退押金,以后都不骑了,这样的开锁成功率无疑是走了一条死路。
蓝牙锁单车缺少持续运营的概念
我把只靠蓝牙开锁的共享单车吐槽成这样,为什么还是有品牌用呢?原因有两个:
1.蓝牙锁开锁耗电极少
2.蓝牙锁成本便宜
不知道大家发现没有,我提到的那两个品牌的单车根本没有我上次介绍的共享单车特有的充电方式(太阳能充电、骑车发电),原因是蓝牙锁的功耗极低,根本没考虑过充电的问题。
蓝牙锁在待机情况下,功耗是微安级别的,选择使用这样的开锁方式,共享单车的品牌运营商肯定考虑到这点:蓝牙锁比起 GPRS 锁便宜不少(大概100~200块),而且 GPRS 锁还需要不断的充电,而我用蓝牙锁不用充电就能用个好几年,连充电装置都省了,多好啊。可惜现实并不是这一回事。
上面已经说过了,没有充电方式、没有定位的概念、单车不能直接连接云端服务器是迟早要完的(如果他们想的是看市场的形势,先抢占市场再等着被收购的套路当我没说)。车子的位置不知道代表着一旦丢车就永远找不回来了,车子一旦被盗也永远不知道。单车的投放和维修不能及时掌控,线下维护成本巨高无比,走的运营套路跟机械锁相差无几。
正确的运营姿势
以蓝牙开锁的共享单车运营时间的拉长,劣势会越发明显,甚至会去到无法运营的地步。一旦车丢了,或者车被破解了,或者过两年后没电了,那是不是彻底放弃了原来投放的车?不运营了吗?我们知道 ofo就是这样考虑的,车丢了我就不要了,反正成本低。但你要知道,蓝牙锁比起机械锁成本高了十倍啊,要不就直接上机械锁,要不就想办法在蓝牙开锁的基础上加上 GPRS 模块才是正解。
之前我也幻想过,如果想快速创建品牌运营运营共享单车,除去考虑开锁时间短、易用性佳等必要的用户体验外,还需要在车辆的安全性(防盗防丢失防破解)和单车锁的成本之间作一个权衡。
单车蓝牙锁的确更便宜,两年内无需充电的特点也缩减了硬件成本,但说到底并不安全,没有定位也增加了运营成本。最好的解决方法应该是在蓝牙锁中添加 GPRS 模块,用蓝牙作为主要开锁方式,一旦蓝牙失效或失去服务器信息反馈,锁中的 GPRS 被唤醒,让锁能与服务器直接建立连接。这样既保证了安全性,减低开锁失败概率,也尽可能省电和节约硬件成本。
目前为止我还是赞同 云巴 这家的做法(估计有人又会说我打广告写软文了),至于其他品牌方案,还需要更深入的考察和了解。