iOS开发高级分享 - iOS上的设备标识符和指纹

苹果承认的标识符

Apple提供了各类API,以方便用户识别各类用途:安全

通用标识符(UDID)

在iOS的早期,苹果公司提供了一个uniqueIdentifier财产上UIDevice-亲切地称为udid (不要与UUID混淆)。虽然这样的功能在今天看来是不可想象的,但该属性一直存在到IOS 5,直到它被废弃并被替换为identifierForVendor在iOS 6中。服务器

供应商标识符(IDFV)

从IOS 6开始,开发人员可使用identifierForVendor财产上UIDevice若要生成在同一供应商建立的应用程序和扩展之间共享的惟一标识符(idfv).网络

import UIKit
let idfv = UIDevice.current.identifierForVendor // BD43813E-CFC5-4EEB-ABE2-94562A6E76CA

根据文献 identifierForVendor回归nil“在从新启动设备以后,但在用户解锁设备以前。”目前还不清楚何时会出现这种状况,可是若是你的应用程序在后台作了什么事情,必定要记住一些事情。app

广告标识符(IDFA)

连同identifierForVendor引进了一种新的行政支助框架,这是苹果建立的,以帮助区分应用程序功能所需的识别功能与任何服务于广告的东西。框架

结果advertisingidentifier财产(亲切地称为idfa(由其同伙)不一样于identifierForVendor经过为每一个人返回相同的值。值能够更改,例如,若是用户重置广告标识符或者抹去他们的设备。ide

import AdSupport
let idfa = ASIdentifierManager.shared().advertisingIdentifier


若是广告跟踪受到限制,则该属性将返回一个归零UUID。学习

idfa.uuidString == "00000000-0000-0000-0000-000000000000" // true if the user has limited ad tracking

奇怪的是,MacOS Mojave引入了一个clearAdvertisingIdentifier()方法,它彷佛会建立一个“公地悲剧”在这种状况下,一个应用程序可能会破坏其余人的利益。(从用户的角度来看,这不是一件坏事!)字体

还有一个奇怪的例子isAdvertisingTrackingEnabled财产。根据文献:
在执行任何广告跟踪以前,请检查此属性的值。若是值为false,则只将广告标识符用于如下目的:频率限制、属性、转换事件、估计惟一用户的数量、广告欺诈检测和调试。
这种“荣誉制度”方法听从性使人困惑。这让你想知道是什么用法不会属于这些普遍的津贴范围以内。
若是你对这件事的警力有任何洞察力,给咱们一条线-咱们想听更多.ui

 DeviceCheck

identifierForVendor和advertisingIdentifier提供与uniqueIdentifier属性在IOS 6中替换,只有一个例外:可以在设备重置和应用程序卸载过程当中持久化。编码

在iOS 11中,苹果悄悄地推出了DeviceCheck框架,它容许开发人员分配由Apple持久化的两位信息直到开发人员手动删除.

任何熟悉DeviceCheck框架的人都应该熟悉与DeviceCheck框架的交互APN在App Store Connect和您的服务器上设置设备以后,客户端在设备上生成令牌,这些令牌被发送到服务器以设置或查询两位信息:

import DeviceCheck

let device = DCDevice.current
if device.isSupported {
device.generateToken { data, error in
if let token = data?.base64EncodedString() {
send token to your server
}
}
}

基于设备令牌和客户端发送的其余信息,服务器告诉Apple经过发送以下JSON有效负载来设置每一个位值:

{
"device_token": "QTk4QkFDNEItNTBDMy00Qjc5LThBRUEtMDQ5RTQzRjNGQzU0Cg==",
"transaction_id": "D98BA630-E225-4A2F-AFEC-BE3A3D591708",
"timestamp": 1572531720,
"bit0": true,
"bit1": false
}


为了在稍后的时间点检索这两位,服务器发送一个没有bit0和bit1字段:

{
"device_token": "QTk4QkFDNEItNTBDMy00Qjc5LThBRUEtMDQ5RTQzRjNGQzU0Cg==",
"transaction_id": "D98BA630-E225-4A2F-AFEC-BE3A3D591708",
"timestamp": 1572532500
}

 

若是一切正常,苹果的服务器将以200状态代码和如下JSON有效负载:

{
"bit0" : true
"bit1" : false,
"last_update_time" : "2019-10"
}

 

据称,苹果建立了DeviceCheck框架,以知足优步在限制滥用促销代码方面的需求。虽然DeviceCheck支持存储只两位信息(例如,足以肯定设备是否曾被用于建立账户以及设备是否与欺诈活动相关联),咱们(诚然是模糊的)担忧时间戳,即便是截断,也可能被用来存储两位以上的信息。

今日iOS的指纹图谱

尽管苹果提供了这些服务,但广告商仍在继续努力规避用户隐私保护,并利用他们掌握的全部信息,以其余方式识别用户。

多年来,苹果对设备硬件信息的访问受到限制,已安装的应用程序, 附近WiFi网络...他们要求应用程序请求许可才能得到您当前的位置,访问您的相机和麦克风,浏览您的联系人,并找到并链接到蓝牙附件。他们采起了大胆的步骤防止Safari中的用户跟踪.

因为缺少这方面的信息,公司不得不发挥创造力,从现有信息的残余物中提炼出独特的身份。这种由外部因素组合而成的识别过程称为指印.

不幸的现实是,咱们能够经过微不足道的少许信息获得独特的识别。例如,一个群体中的个体最多能够被四个时间戳坐标所挑选出来。(de Montjoye,Hidalgo,Verleysen,&Blondel,2013年)或者仅仅是生日和邮政编码(Sweeney,2000年).

自2012年以来,每一个WWDC都举办了一次关于隐私的会议,但惟一特别提到指纹的是2014年的简短讨论如何避免这样作。

根据咱们的计算,坚决的一方可使用传统的、不受限制的API来产生几十个随机性:

地区信息(~36位)
地区信息是在苹果平台上识别信息的最大来源。你喜欢的语言、区域、日历、时区的组合,以及你安装的键盘很大程度上说明了你是谁--尤为是在你没有那么传统的偏好的状况下。

import Foundation

Locale.current.languageCode
log2(Double(Locale.isoLanguageCodes.count)) // 9.217 bits

Locale.current.regionCode
log2(Double(Locale.isoRegionCodes.count)) // 8 bits

Locale.current.calendar.identifier
// ~2^4 (16) Calendars

TimeZone.current.identifier
log2(Double(TimeZone.knownTimeZoneIdentifiers.count)) // 8.775 bits

UserDefaults.standard.object(forKey: "AppleKeyboards")// ~2^6 (64) iOS keyboards

 

 

咱们最近推特关于能够不受限制地访问表情符号键盘信息的应用程序。从那时起,咱们就被告知苹果公司正在调查这一问题。

可访问性(~10位)
可访问性首选项还提供了大量的信息,每一个单独的设置都贡献了一个潜在的比特:

UIAccessibility.isBoldTextEnabled
UIAccessibility.isShakeToUndoEnabled
UIAccessibility.isReduceMotionEnabled
UIAccessibility.isDarkerSystemColorsEnabled
UIAccessibility.isReduceTransparencyEnabled
UIAccessibility.isAssistiveTouchRunning


约25%的用户利用动态类型经过配置首选字体大小,该选择还可用于指纹:

let application = UIApplication.shared
application.preferredContentSizeCategory


硬件信息(~5或~6位)
尽管这些年来,操做系统更新中大多数最活跃的比特都被锁定了,但仍然有足够多的比特用于识别。

在IOS上,您能够得到用户设备的当前模型和存储量:

import UIKit

let device = UIDevice.current
device.name // "iPhone 11 Pro"

let fileManager = FileManager.default
if let path = fileManager.urls(for: .libraryDirectory, in: .systemDomainMask).last?.path,
let systemSize = try? fileManager.attributesOfFileSystem(forPath: path)[.systemSize] as? Int
{
Measurement<UnitInformationStorage>(value: Double(systemSize), unit: .bytes)
.converted(to: .gigabytes) // ~256GB
}

 

带着14个支持的IOS设备,大多数都有3种配置,假设这贡献了大约32种可能性,或者说是5位。

您能够在MacOS上更进一步,经过处理器计数和RAM数量来进一步区分硬件:

processInfo.processorCount // 8

Measurement<UnitInformationStorage>(value: Double(processInfo.physicalMemory),
unit: .bytes)
.converted(to: .gigabytes) // 16GB

 

很难感受到有多少种不一样的mac型号在使用?,可是一个合理的估计大概是2。6或27.

 蜂窝网络(~2比特)
知道某人的手机是在威瑞森仍是沃达丰,也能够被考虑到指纹。您可使用CTTelephonyNetworkInfo类的CoreTelephone框架若要查找具备蜂窝服务的设备的提供程序,请执行如下操做:

import CoreTelephony

let networkInfo = CTTelephonyNetworkInfo()
let carriers = networkInfo.serviceSubscriberCellularProviders?.values
carriers?.map { ($0.mobileNetworkCode, $0.mobileCountryCode) }

 

每一个国家的供应商数量各不相同,但以美国的4家主要运营商为指导,咱们能够说,运营商信息将贡献约2位(若是您安装了多个SIM卡,则贡献更多)。

通讯首选项(2位)
更广泛的是,即便知道某人是否能够发送短信或电子邮件,也能够被考虑到指纹中。能够在没有权限的状况下经过MessageUI框架.

import MessageUI

MFMailComposeViewController.canSendMail()
MFMessageComposeViewController.canSendText()

 

识别信息的其余来源
若是数字指纹的使用看起来很奇怪的话,那只是触及了公司和研究人员如何绕过你的隐私的表面而已。

 GeoIP与相关网络速度
虽然经过传统的API访问地理位置须要明确的受权,可是第三方可能可以根据访问Internet的方式对您所处的世界的位置有一个大体的了解。

按源IP地址定位普遍用于区域锁定和本地化。您还能够将此信息与平时测量到已知位置的主机,以便更准确地定位位置。(Weinberg,Cho,Christin,Sekar,&Gill,2018):

ping -c 5 99.24.18.13 # San Francisco, USA

--- 99.24.18.13 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 11.900/12.184/12.895/0.380 ms

ping -c 5 203.47.10.37 # Adelaide, Australia

--- 203.47.10.37 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 202.122/202.433/203.436/0.504 ms

 

电池健康

目前还不清楚这是否在IOS中引发关注,但取决于UIDevice电池API是,您可使用它们来识别设备的电池健康。(Olejnik,Acar,Castelluccia,&Diaz,2016年)

var timestampedBatteryLevels: [(Date, Float)] = []

if UIDevice.current.isBatteryMonitoringEnabled {
timestampedBatteryLevels.append((Date(), UIDevice.current.batteryLevel))
}

所以,电池级API是在Firefox 55中删除.若是这看起来很奇怪,那么考虑一下苹果公司(Apple)最近发布了一项iOS的安全更新,由于研究人员证明,陀螺仪校准设置中的微小差别能够用来惟一地识别设备。(张,贝雷斯福,雪莱,2019年)

另外,若是你想一块儿进阶,不妨添加一下交流群[1012951431],选择加入一块儿交流,一块儿学习。期待你的加入!(进群可领取学习礼包)

参考文献

  •  de Montjoye,Y.-A.,Hidalgo,C.A.,Verleysen,M.,&Blondel,V.D.(2013年)。在人群中独一无二:人类移动的隐私范围。科学报告, 三、1376号。https://doi.org/10.1038/srep01376
  •  Sweeney,L.(2000年)。简单的人口统计每每能识别出独特的人。卡内基梅隆大学,数据隐私...工做文件。从http://dataprivacylab.org/projects/identifiability/检索
  •  Weinberg,Z.,Cho,S.,Christin,N.,Sekar,V.,&Gill,P.(2018)。如何捕捉代理说谎:验证网络代理的物理位置与主动地理定位。在……里面2018年因特网计量会议记录(第203-217页)。纽约,纽约,美国:ACM。https://doi.org/10.1145/3278532.3278551
  •  Olejnik,L.,Acar,G.,Castelluccia,C.,&Diaz,C.(2016)。漏水的电池。在……里面第十次数据隐私管理和安全保证国际讲习班的订正论文-第9481卷(第254至263页)。纽约,纽约,美国:斯普林格-维拉格纽约公司。https://doi.org/10.1007/978-3-319-29883-2_18
  •  张,J.,贝雷斯福德,A.R.,&Sheret,I.(2019)。SensorID:用于智能手机的传感器校准指纹。在……里面第40届IEEE安全与隐私专题讨论会会议纪要...IEEE。

翻译地址:https://nshipster.com/device-identifiers/

相关文章
相关标签/搜索