技术分析
采集设备信息需要关注的问题:用户设备是真实设备?哪个设备信息是稳定?Android系统大版本升级是否导致权限变动?采集的数据是否符合隐私合规政策?采用什么算法来计算出唯一ID?新APP上线所有设备ID是全新?
技术实现流程:通过采集客户端的特征属性信息并将其加密上传到云端,然后通过特定的算法分析并为每台设备生成唯一的ID来标识这台设备。
设备指纹必须具备:稳定性、唯一性、安全性、易用性、高性能。
设备环境风险特征:识别模拟器环境、多开、ROOT、篡改设备参数、脚本,等异常环境特征。具有稳定性高,性能高。
通常情况下,设备指纹采集到用户的设备数据后,数据会通过异步方式先上传到业务的服务器上,然后再通过代理服务端进行转发到对应设备指纹的服务端。这样也是为了保证数据的安全性,客户端采集数据功能防止被剥离,从而采集不到设备数据。采集的数据一般通过json格式加密数据进行上传。
设备指纹上传一般采用URL的POST请求,并集成json格式,并且所采集的字段信息中会有一些字段是无用的,有一些字段适用于对json信息采用强校验的混淆信息。
设备指纹中设备风险识别的微行为常用的属性:电池状态、重力传感器、加速度传感器状态、联网状态、USB状态、触摸轨迹、压感、按压时长、剪切板。
设备指纹的SDK主要以java代码和C、C++代码为主,java代码部分是以aar包或jar包方式存在,C\C++代码主要以SO方式存储的。例如某易的设备指纹就是以aar包(NEDevice-SdkRelease_v1.7.0_2022xxxxxx.aar)单独方式存在,某盾的设备指纹以aar文件(fraudmetrix-xxx.aar)和so文件(libtongdun.so)两者相结合存在,某美的设备指纹以aar包(smsdk-x.x.x-release.aar)和so文件(libsmsdk.so)相结合存在。
设备指纹主要是通过集成到APP中的SDK,还有小程序的SDK,通常情况下是采用aar包方式进行提供的SDK,还有就是强度较高的是通过aar包和SO文件进行结合集成的设备指纹SDK。将关键的采集信息集成到SO中代码中实现,并且SO文件采用虚拟机保护。
下面是某设备指纹以aar形式的,它关键代码都是java实现的。并且java代码利用proguard 混淆规则进行对aar的class类进行混淆类名而已,并没有混淆到函数名称和变量名称,字符串信息。
下面是某设备指纹的java代码和C++代码部分,java代码和C++代码都采用了虚拟化保护技术进行保护。
设备指纹读取用户信息,通常需要涉及到向用户申请权限的情况,所以在android的AndroidManifest.xml配置文件中通常有一系列的权限申请。
(上图只是申请权限的一小部分)