风控之Android设备指纹技术

  1. 标识性参数——Android ID、IMEI、OAID
  2. 非标识性参数
    • 非标识性参数——手机运营商

1 设备指纹

简单来讲,设备指纹是指用于标识出该设备的设备特征。可以是单一设备特征,也可以是多种设备特征的组合,以方便风控系统对设备的唯一性进行识别。设备指纹是风控系统里一个重要的控制维度。
设备指纹应该保证同一台设备生成的设备指纹具有唯一性、不重复性和不易篡改性。

1.1 设备指纹的应用

在黑产对抗、反欺诈等领域中,设备指纹已经成为了基础技术。

例如,网络支付公司的风险管理系统引入设备指纹指纹技术,可贯穿于所有需要风险判断的场景。比如,垃圾注册,如果同一设备注册次数过多或注册时间异常,即发出风险警报或进入二次验证过程,防止拖库撞库的风险行为;当支付时,同一设备支付金额过大或频繁交易,那么就要警惕是否有洗钱的风险。支付环节需求严格管控,传统的IP容易伪造代理等,并且精度不够细,设备指纹完美地补充了这一风险漏洞。

问题1:既然最终使用的设备控制权在用户(黑产)手上,那设备风控到底还有什么意义?
设备风控不仅仅包含设备指纹这一项,还有例如对设备是否ROOT、设备是否被修改(Xposed/Frida/定制ROM)、设备运行状态、设备网络状态等等更全面的信息采集。
设备指纹在高强度对抗的情况下,确实意义不大。从定制Hook框架到定制ROM,以致于到了更底层Linux内核的修改后,设备指纹其实已经失去了原本的意义。因为从理论上来说一切可以采集的参数均是来自于系统接口、内核接口以及特定的行为痕迹,综上所述一切参数在特定情况下都是可伪造的。但不可否认的是,设备指纹对于增加黑产对抗难度和某些特定场景的标识,还是具有一定作用的。在这里插入图片描述
任何一层均有黑产作案的可能性

1.2 设备指纹常见技术

在设备风控领域,从最初简单的设备指纹、存储ID到本地文件这种简单方法,到后来出现的采集很多ID参数云端识别,再到现在的基于设备的非标识性参数进行关联分析的方案,黑产和风控的对抗是一步步不断进化和不断迭代的过程。

问题2:什么是基于非标识性参数的关联分析识别?
所谓的基于非标识性参数的关联分析识别,就是基于多个不带标识类的参数进行配合识别的技术,行业内常称为‘关联检测’。
标识符类参数:IMEI、MAC地址、oaid这一类本身对设备的具有唯一性、标识性的参;
非标识类参数:除了上述类型以外的,不具有唯一性或者标识性的设备参数;如,网络类型(WiFi/4G/3G)、电池电量信息、内存大小等

1.单一/简单组合特征
最开始应用设备指纹大概应该是广告行业。在广告行业里很早就开始收集浏览器的cookie、安卓系统的IMEI和MAC来识别设备的唯一性以便过滤假量刷量。
特点:收集客户端可以收集的唯一标识,只要有一个标识相同就视为同一台设备
缺点:方法比较原始,只需要简单篡改标识就可以轻松过掉
2.关联检测:基于设备的非标识性参数进行关联分析
从设备上收集多种多维度的设备信息和特征符,通过云端对比识别设备差异度,设定一个差异度阀值,当差异度比较低时则视为同一个设备。
特点:多种维度配合,不依赖于某一个特征或者标识符
市面上大多数的产品均是采用这种方式,具体效果决定于特征的多样性和对比算法的准确性

2 如何获取设备信息?

2.1 设备唯一标识符 UDID

设备唯一标识符 UDID(Unique Device Identifier):可以唯一标识设备的标识符都可称为UDID。

2.1.1 Android ID

16进制字符串(64bit 16*4)不具备一致性;
设备首次启动时,系统会随机生成一个64位16进制字符串,这个16进制的字符串就是ANDROID_ID,当设备被恢复出厂设置后该值会被重置。

  • Android低板本可以作为候补;
  • Android O( Android8.O以上)时,ANDROID_ID的行为将发生变化。每个用户在手机上的每个应用的ANDROID_ID都不同。ANDROID_ID根据应用签名和用户的不同而不同。 ANDROID_ID的唯一决定于应用签名、用户和设备三者的组合。

获取方法:

//不需要任何权限
public static String getAndroidID(Context context) {String androidID = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);Log.i("Identifier", "AndroidID:" + androidID);return "AndroidID:" + androidID;
}

2.1.2 IMEI、MEID

IMEI和MEID其实都是用来标识设备的识别码,可通过拨打*#06# 查询。​具有一致性;
不同的是IMEI标识的是支持GSM网络制式的设备,MEID标识的是支持CDMA网络制式的设备。

什么是GSM和CDMA呢? CDMA和GSM简单点说其实就是使用了不同的通信技术,以下表格显示了各大运营商所使用的通信技术
在这里插入图片描述

IMEI、MEID是设备相当于我们手机的身份证号码,是写在主板上的,除非更换主板,否则只要有权限获取,任意APP、任意系统版本下获取的IMEI都是一致的。而现在我们的手机大都是双卡双待,可以同时插入两张同时支持GSM网络、CDMA网络的卡,所以就出现一部手机有两个IMEI号,两个MEID号码。所以这些手机IMEI和MEID号码都有。

注意:IMEI和MEID是标识手机设备,跟我们手机插什么卡没有关系。

获取方法:

/**
Android版本小于6.0,安卓APP需要申请用户电话授权,才获取: getDeviced()
Android [6.0,10.0],安卓APP需要动态申请用户电话授权,才能获取IMEI。<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />Android [6.0,8.0) : telManager.getDeviceId();Android [8.0,10.0): telManager.getImei(0)、 telManager.getImei(0);
Android 10以上无法获取;(即使申请了 READ_PHONE_STATE 权限)
**///telManager.getDeviceId();该方法得到的并不一定是IMEI。对于只有GSM制式的手机是得到的是IMEI,对于只有CDMA制式的手机,返回的是ESN或MEID。public static  String getIMEI(Context context){TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {//Android 8: This method was deprecated in API level 26.String IMEI = telManager.getDeviceId();Log.i("Identifier", "IMEI:" + IMEI);return "IMEI:" + IMEI;} else if(Build.VERSION.SDK_INT>Build.VERSION_CODES.O && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){//Android 8: These methods were added in API level 26.String imei1 = telManager.getImei(0);String imei2 = telManager.getImei(1);Log.i("Identifier", "IMEI卡槽1:" + imei1);Log.i("Identifier", "IMEI卡槽2:" + imei2);String meid1 = telManager.getMeid(0);String meid2 = telManager.getMeid(1);Log.i("Identifier", "MEID卡槽1为:" + meid1);Log.i("Identifier", "MEID卡槽2为:" + meid2);return "IMEI卡槽1:" + imei1 + "IMEI卡槽2:" + imei2 + "MEID卡槽1为:" + meid1 + "MEID卡槽2为:" + meid2;} else {try{String imei1 = telManager.getImei(0);String imei2 = telManager.getImei(1);Log.i("Identifier", "IMEI卡槽1:" + imei1);Log.i("Identifier", "IMEI卡槽2:" + imei2);String meid1 = telManager.getMeid(0);String meid2 = telManager.getMeid(1);Log.i("Identifier", "MEID卡槽1为:" + meid1);Log.i("Identifier", "MEID卡槽2为:" + meid2);return "IMEI卡槽1:" + imei1 + "IMEI卡槽2:" + imei2 + "MEID卡槽1为:" + meid1 + "MEID卡槽2为:" + meid2;}catch (Exception e){Log.i("Identifier", e + "Android10及以上版本禁止获取IMEI");return e + "Android10及以上版本禁止获取IMEI";}}}

2.1.3 OAID

匿名设备标识符:16进制字符串(256bit 64*4)具有一致性;

OAID字段是由中国信通院联合华为、小米等厂商共同推出的设备识别字段,具有唯一性和权威性,可满定用户行为统计的使用场景。一种在国行系统内使用的、应对 Android 10 限制读取 IMEI 的广告跟踪标识符。

(同一设备不同应用的OAID相同)发生几种情况发生时,OAID重置:

  • 用户在系统设置中手动重置,匿名设备标识符将重置;
  • 移动智能终端恢复出厂设置时,匿名设备标识符将重置;
  • 匿名设备标识符自身可定期重置。

另外,用户还可以自主关闭匿名设备标识符,关闭后返回值的值是NO。

获取方法:

在这里插入代码片

2.1.4 SN号(设备序列号)​

SN号(设备序列号)​:可通过拨打*#06# 查询(华为)。

在Android 7.1或更早系统(SDK<=25),可通过android.os.Build.SERIAL获得,由厂商提供。​
如果厂商比较规范的话,设备序列号+Build.MANUFACTURER应该能唯一标识设备UDID。但现实是并非所有厂商都按规范来,尤其是早期的设备。​最致命的是,Android 8.0及 以上(SDK>=26),android.os.Build.SERIAL 总返回 “unknown”;若要获取序列号,可调用Build.getSerial() ,但是需要申请 READ_PHONE_STATE 权限。​
到了Android 10.0(SDK>=29)以上,则和IMEI一样,也被禁止获取了。​

2.1.5 Mac地址

大多android设备都有wifi模块,因此,wifi模块的MAC地址就可以作为设备标识。基于隐私考虑,官方不建议获取
获取MAC地址也是越来越困难了,Android 6.0以后通过 WifiManager 获取到的mac将是固定的:02:00:00:00:00:00
7.0之后读取 /sys/class/net/wlan0/address 也获取不到了(小米6)。

获取MAC地址的方法有两种:

(1). 通过Linux命令查询

public String getMacAddress() {String macAddress = null ;String str = "" ;try {//linux下查询网卡mac地址的命令Process pp = Runtime.getRuntime().exec( "cat /sys/class/net/wlan0/address" );InputStreamReader ir = new InputStreamReader(pp.getInputStream());LineNumberReader input = new LineNumberReader(ir);for (; null != str;) {str = input.readLine();if (str != null ) {macAddress = str.trim(); // 去空格break ;}}} catch (IOException ex) {ex.printStackTrace();}return macAddress;
}

缺点:在当前没打开WiFi的情况下获取得到的MAC地址值为空,即使在执行这段代码前是有打开过WiFi,而执行这段代码时WiFi状态是关闭的,也不能获取到MAC地址。

(2). 通过Android官方的WifiManager类获取

public String getMacAddress() {String macAddress = null ;WifiManager wifiManager =(WifiManager)MyApplication.getContext().getSystemService(Context.WIFI_SERVICE);WifiInfo info = ( null == wifiManager ? null : wifiManager.getConnectionInfo());macAddress = info.getMacAddress();return macAddress;
}需要加入权限
< uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" />

缺点:这种方法虽然能在当前Wifi状态为关闭的情况下获取到MAC地址,但前提是在手机开机后要打开过一次Wifi,如果在某次开机后没打开过Wifi就调用这段代码,获取地址也是为空。

网上给出的解释是:WiFi的Mac address是一个被动资讯。一般在开机后,不会主动上报到系统裡。要待WiFi硬件启动后,才会把有关Mac address资料记载入系统去。

转载链接

AndroidID、IMEI、OAID获取:https://blog.csdn.net/Myfittinglife/article/details/121520111
Android风控知识:https://bbs.kanxue.com/thread-279619.htm、https://bbs.kanxue.com/thread-275202.htm
常见参数讲解:https://bbs.kanxue.com/thread-265169.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/213815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产品入门第一讲:Axure的安装以及基本使用

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有…

未来教师行业发展前景

亲爱的老师们&#xff0c;你是否对未来教师行业的发展前景感到好奇和期待&#xff1f;作为一名老师&#xff0c;我深知教育行业的重要性和挑战&#xff0c;但同时也看到了其中蕴含的巨大机遇。 一、技术融合与在线教育 技术的飞速发展正在改变着教育的面貌。在线教育平台的崛起…

用C语言了解文件那些下 ‘流‘ 事

本篇会加入个人的所谓‘鱼式疯言’❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的&#xff0c;可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 前言 &#…

uniapp实战 —— 自定义顶部导航栏

效果预览 下图中的红框区域 范例代码 src\pages.json 配置隐藏默认顶部导航栏 "navigationStyle": "custom", // 隐藏默认顶部导航src\pages\index\components\CustomNavbar.vue 封装自定义顶部导航栏的组件&#xff08;要点在于&#xff1a;获取屏幕边界…

OpenAI在中国,申请GPT-6、GPT-7商标

根据最新商标信息显示&#xff0c;OpenAI已经在中国提交了GPT-6和GPT-7的商标注册信息&#xff0c;分类是科学仪器和网站服务两大类。申请日期是今年的11月2日&#xff0c;目前处于审核状态。 该申请由知识产权代理公司完成&#xff0c;但申请人的地址正是OpenAI在美国公司的地…

Echarts图表title使用富文本

rich中有配置的话&#xff08;如a&#xff09;使用该样式&#xff0c;没有配置样式的话&#xff08;如b&#xff09;使用外层textstyle的样式&#xff0c;textstyle没有样式的话使用默认样式 const option1 {tooltip: {trigger: "item",},title: {text: ["{a|1…

Java代码审计之SpEL表达式注入漏洞分析

文章目录 前言SpEL表达式基础基础用法安全风险案例演示 CVE-2022-22963漏洞简述环境搭建反弹shell CVE漏洞调试分析本地搭建调试分析补丁分析 总结 前言 表达式注入是 Java 安全中一类常见的能够注入命令并形成 RCE 的漏洞&#xff0c;而常见的表达式注入方式有 EL 表达式注入…

124.(leaflet篇)leaflet禁止地图移动,缩放,双击

地图之家总目录(订阅之前必须详细了解该博客) 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

【Docker】使用docker-compose搭建django+vue工程文章

我们尝试使用docker-compose编排一个后端基于django,前端基于vue,数据库为postgresql并使用nginx进行反向代理的web工程。 工程准备 Docker 安装Docker 安装docker-compose django 在python3.7的环境下创建 修改settings.py文件 修改 将静态文件收集路径添加进 ,笔…

pip指定优先从豆瓣源下载包

对于 Unix/macOS 系统&#xff0c;使用以下命令&#xff1a; pip config set global.index-url https://pypi.douban.com/simple/ 对于 Windows 系统&#xff0c;打开命令提示符或PowerShell&#xff0c;并使用相同的命令&#xff1a; pip config set global.index-url http…

XUbuntu22.04之8款免费UML工具(一百九十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

供应链管理痛点大解析!内附解决方案

供应链是指涉及产品或服务生产、运输、分销和最终交付给客户的过程。 用一个汽车制造的例子来帮助大家理解&#xff1a; 原材料采购&#xff1a; 汽车制造商需要从供应商处采购制造汽车所需的原材料&#xff0c;例如金属、橡胶、塑料和玻璃。生产制造&#xff1a;获得原材料&…

UnoCSS 原子化开发初体验

UnoCSS 是一个即时的原子化 CSS 引擎&#xff0c;旨在灵活和可扩展。核心是不拘一格的&#xff0c;所有的 CSS 工具类都是通过预设提供的。再也不用为了取一个 classname 类名而烦恼了。 一、UnoCSS 特点 完全可定制&#xff1a;无核心工具&#xff0c;所有功能都通过预设提供…

如何公网访问内网的群晖NAS随时随地远程访问本地存储的学习资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

成都工业学院Web技术基础(WEB)实验六:ECMAScript基础语法

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

TwinCAT3 Modbus-TCP Client/Server使用

目录 一、环境配置和准备 1、PLC中安装TF6250-Modbus-TCP库 2、勾选TF6250的license 3、PLC工程中添加Tc2_ModbusSrv库文件 4、分别创建测试ModbusTCP测试的Server和Client程序 二、PLC作为Client端 1、设置测试电脑IP地址 2、运行MobusTCP测试工具 3、PLC端程序编写 …

Hiera实战:使用Hiera实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

可学习超图拉普拉斯算子代码

python版本&#xff1a;3.6。sklearn版本&#xff1a;scikit-learn0.19 问题1&#xff1a;ERROR: Could not build wheels for ecos, scs, which is required to install pyproject.toml-based projects| 解决办法&#xff1a;cvxpy安装过程中遇到的坑_ecos 2.0.7.post1 cp37 …

大数据技术7:基于StarRocks统一OALP实时数仓

前言&#xff1a; 大家对StarRocks 的了解可能不及 ClickHouse或者是远不及 ClickHouse 。但是大家可能听说过 Doris &#xff0c;而 StarRocks 实际上原名叫做 Doris DB &#xff0c;他相当于是一个加强版的也就是一个 Doris ,也就是说 Doris 所有的功能 StarRocks 都是有的&a…

【设计模式--结构型--桥接模式】

设计模式--结构型--桥接模式 桥接&#xff08;Bridge&#xff09;模式定义结构案例好处使用场景 桥接&#xff08;Bridge&#xff09;模式 定义 将抽象与实现分离&#xff0c;使他们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这两个维…