# 美团SSO登录过程分析 ## 背景 最近在研究安卓应用的一键登录功能,发现大部分应用的一键登录功能都需要拉起已登录的app进行验证,而美团却能直接识别出已登录的app,十分神奇,因此对这一过程进行逆向分析。 ## SSO登录包 ![](https://i.imgur.com/RMogUxq.png) 登录时的数据包如图所示,由于测试次数过多返回包显示need_verify,正常情况下应该是直接登陆成功。对请求包进行测试的结果可以得出,其中主要有三个关键字段:fingerprint、unionid和mtgsig,接下来我们逐一进行分析。 ## fingerprint 该字段主要与com.meituan.android.common.fingerprint.info.FingerprintInfo类有关,其中包括大量设备信息: ![](https://i.imgur.com/ywyPMcd.png) 虽然信息项很多,不过app里可以直接调用com.meituan.android.common.fingerprint.FingerprintManager.fingerprint方法一次性采集齐全。 ## mtgsig 该字段是对数据包的签名,在com.meituan.android.common.mtguard.MTGuard.requestSignatureForBabelV4方法中生成,参数为网络请求的url和body: ![](https://i.imgur.com/OPOtnS8.png) 继续往下追会发现签名逻辑是在native实现的,遂放弃。但是签名的密钥是写死的,通过这个函数就可以对任意数据包进行签名,因此保护力度相对来说也不是很强。 ## unionid 该字段是对用户身份的鉴别,在所有美团系app中共享。那么未登录的美团是如何知道这个ID的呢?在代码中大量搜索之后终于找到下图的位置: ![](https://i.imgur.com/oroGX2X.png) 也就是用deviceInfo向服务器换来的。继续看看其中包含些什么: ![](https://i.imgur.com/V2bJPnu.png) 疑似有很多设备信息,但是抓包测试后发现,唯一有用的字段是一个token: ![](https://i.imgur.com/5BTJoYO.png) 其中又需要设备的品牌、型号和android_id。这个id在安卓上约等于设备的唯一标识符,只要不刷机就不会改变;同时它在同一签名中的应用中是共享的,所以所有美团系的app都会获得同一个android_id,发往服务器之后,服务器就能识别出该设备上还有其他已登录的美团app,从而返回unionid。 ## 总结 ![](https://i.imgur.com/rEaweNt.png) 整个SSO登录的流程如上图所示。可以看出,整个链条的起点是deviceinfo,因此美团SSO本质上是一个设备信任的机制,通过设备id来识别其中已经登录的美团系应用。这一机制的有效性依赖于设备信息的唯一性和可靠性,其安全性值得进一步研究。