风控之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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BSN实名DID服务发布会将于12月12日在北京召开

当前&#xff0c;数字身份已经成为实现经济健康发展与社会和谐安全稳定的重要基础&#xff0c;同时也是激发数据要素价值&#xff0c;支持数字经济快速发展的重要手段&#xff0c;在数字中国建设中发挥着至关重要的作用。 2016年&#xff0c;经国家发展改革委批准&#xff0c;…

2023.12.9 关于 Spring Boot 事务传播机制详解

目录 事务传播机制 七大事务传播机制 支持当前调用链上的事务 Propagation.REQUIRED Propagation.SUPPORTS Propagation.MANDATORY 不支持当前调用链上的事务 Propagation.REQUIRES_NEW Propagation.NOT_SUPPORTED Propagation.NEVER 嵌套事务 Propagation.NESTED…

币圈新贵Blast,一条可以帮助用户赚钱的Layer2!

Blast在短短两天内实现了超过2亿美元的TVL飙升&#xff0c;这一迅猛增长让整个低迷已久的Layer2市场感到震惊。尽管Blast主网要到二月份才正式上线&#xff0c;但这并未能阻挡用户们热情地锁仓。截至目前&#xff0c;Blast已经吸引了超过75,000名用户&#xff0c;总锁定价值已经…

直流电和交流电

直流电&#xff08;Direct Current&#xff0c;简称DC&#xff09;和交流电&#xff08;Alternating Current&#xff0c;简称AC&#xff09;是电流的两种基本形式。 1. 直流电 直流电是指电流方向始终保持不变的电流。在直流电中&#xff0c;电子只能沿着一个方向移动。直流电…

UEFI下Windows10和Ubuntu22.04双系统安装图解

目录 简介制作U盘启动盘并从U盘启动电脑安装系统安装Windows系统安装Ubuntu 附录双系统时间不一致 简介 传统 Legacy BIOS主板下的操作系统安装可参考本人博客 U盘系统盘制作与系统安装&#xff08;详细图解&#xff09; &#xff0c;本文介绍UEFI主板下的双系统安装&#xff…

快手商品采集API商品列表API商品详情数据API接口获取快手商品信息API

背景介绍 快手商城是快手平台上的一个电商购物频道&#xff0c;类似于淘宝、京东等商城&#xff0c;用户可以通过搜索或者快手 App 首页的一级入口进入。目前&#xff0c;快手商城正在招商中&#xff0c;今年双 11 期间&#xff0c;快手将力推短视频、直播间、店铺、商城这一全…

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(三)——serverless数据分析

3 serverless数据分析 大纲 3 serverless数据分析3.1 创建Lambda3.2 创建API Gateway3.3 结果3.4 总结 3.1 创建Lambda 在Lambda中&#xff0c;我们将使用python3作为代码语言。 步骤图例1、入口2、创建&#xff08;我们选择使用python3.7&#xff09;3、IAM权限&#xff08;…

C# 数据的保存和提取(.TXT格式)

红色部分的才是最终版 一、将页面内容保存到文件中 第一步 创建Visual的Windows窗体应用,使用的是 第二步 创建几个Label控件、TextBox控件、以及Button按钮,而TextBox控件放入Panel中 第三步 先对写法进行了解,了解保存的语句 StreamWriter sw= new StreamWriter(TXT…

自定义类型详解(1)

文章目录 目录1. 结构体1.1 结构的基础知识1.2 结构的声明1.3 特殊的声明1.4 结构的自引用1.5 结构体变量的定义和初始化1.6 结构体内存对齐1.7 修改默认对齐数1.8 结构体传参 2. 位段2.1 什么是位段2.2 位段的内存分配2.3 位段的跨平台问题2.4 位段的应用 3. 枚举3.1 枚举类型…

Appium python自动化测试系列之移动自动化测试!

1.1 移动自动化测试现状 因为软件行业越来越发达&#xff0c;用户的接受度也在不断提高&#xff0c;所以对软件质量的要求也随之提高&#xff0c;当然这个也要分行业&#xff0c;但这个还是包含了大部分。因为成本、质量的变化现在对自动化测试的重视度越来越高&#xff0c;在…

mmseg上手自己的数据集

制作自己的数据集&#xff0c;VOC格式为例。 这三个文件包括数据集的名称。可以使用labelme脚本自动生成。 跟据预测类别修改配置文件 D:\projects\mmsegmentation-main\mmseg\datasets\voc.py 因为是voc格式的数据集&#xff0c;在这个文件里进行配置&#xff0c;修改成自己数…

保研毕业论文查重率多少通过【保姆教程】

大家好&#xff0c;今天来聊聊保研毕业论文查重率多少通过&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 保研毕业论文查重率多少通过 在保研过程中&#xff0c;毕业论文的查重率是衡量学术诚信和论文…

微信社群机器人开发

简要描述&#xff1a; 删除朋友圈 请求URL&#xff1a; http://域名地址/deleteSns 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId…

AMEYA360--罗姆与Quanmatic公司利用量子技术优化制造工序并完成验证

全球知名半导体制造商罗姆(总部位于日本京都市)于2023年1月起与 Quanmatic Inc.(总部位于日本东京都新宿区&#xff0c;以下简称“Quanmatic”)展开合作&#xff0c;在半导体制造工序之一的EDS工序中测试并引入量子技术&#xff0c;以优化制造工序中的组合。目前&#xff0c;双…

ip ssl证书怎么更换ip地址

ip ssl证书是一种数字证书&#xff0c;为只有公网ip地址的站点建立安全、加密的通信通道。它通常由权威的证书颁发机构&#xff08;CA&#xff09;颁发&#xff0c;并用于验证网站的身份和安全性。ip ssl证书的主要目的是保护敏感信息&#xff0c;如信用卡号、用户名和密码等&a…

15:00面试,15:06就出来了,问的问题太变态了。。

刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还要降…

【Python网络爬虫入门教程3】成为“Spider Man”的第三课:从requests到scrapy、爬取目标网站

Python 网络爬虫入门&#xff1a;Spider man的第三课 写在最前面从requests到scrapy利用scrapy爬取目标网站更多内容 结语 写在最前面 有位粉丝希望学习网络爬虫的实战技巧&#xff0c;想尝试搭建自己的爬虫环境&#xff0c;从网上抓取数据。 前面有写一篇博客分享&#xff0…

如何使用iPhone15在办公室远程观看家里群晖nas上的4k电影?

文章目录 1.使用环境要求&#xff1a;2.下载群晖Video Station&#xff1a;3.公网访问本地群晖Video Station中的电影&#xff1a;4.公网条件下使用电脑浏览器访问本地群晖video station5.公网条件下使用移动端&#xff08;搭载安卓&#xff0c;ios&#xff0c;ipados等系统的设…

Java并发(十七)----变量的线程安全分析

1、成员变量和静态变量是否线程安全 如果它们没有共享&#xff0c;则线程安全 如果它们被共享了&#xff0c;根据它们的状态是否能够改变&#xff0c;又分两种情况 如果只有读操作&#xff0c;则线程安全 如果有读写操作&#xff0c;则这段代码是临界区&#xff0c;需要考虑线…

深信服AF设置安全防护策略

以百度为例&#xff0c;禁止内网用户访问www.baidu.com 1、对象→安全策略模板→新增 2、名称自定义&#xff0c;安全配置只选择url过滤 3、点击图标→新增→设置名称及url 勾选刚刚新增的url--deny→确定 4、高级选项→确定 5、策略→安全策略→安全防护策略→新增用户防护策略…