42
Секретные способы идентификации пользователей iOS Андриан Буданцов

Андриан Буданцов_Секретные способы идентификации пользователей iOS

Embed Size (px)

DESCRIPTION

Секретные способы идентификации пользователей iOS Андриан Буданцов Co-founder and CTO at iOS software company Readdle Как правильно посчитать количество уникальных пользователей, надежно отличать конкретный девайс и бороться с пиратством. Что знают про iOS девайс рекламные сети. История вопроса и последние нововведения.

Citation preview

Page 1: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Секретные способыидентификациипользователей iOS

Андриан Буданцов

Page 2: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Зачем?1. Отличать → считать разныеколичествопрофайлытаргетинг...

2. Хранение данныхнастройкипривязка девайса к аккаунту...

Page 3: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Статистика

Page 4: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Статистика

Page 5: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Идентификация

Page 6: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Идентификатор

разные значения на разных устройствах

одинаков для всех приложений в которыхсобирается статистика

не меняется для одного пользователя

Page 7: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Device Id: uniqueIdentifier

[[UIDevice currentDevice] uniqueIdentifier]

UDID

160-бит число вроде16a830fd2789754cb2b299b067b845f8579d5eb4

слишком привязан к hardware

Page 8: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Device Id: uniqueIdentifier

deprecated в iOS 5 (2011)

начали реджектить весной 2012

приложения в AppStore работали до iOS 6

Page 9: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Device Id: uniqueIdentifierвсе еще используется

для development и adhoc сборок

в Mobile Device Management

Page 10: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Свой идентификатор

UUID — случайное 128-бит число

сохранить в настройки

не выдерживает переустановку

работает только с одним приложением

выдерживает backup-restore на другойдевайс

Page 11: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Свой идентификаторKeyChain

appUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];[SSKeychain setPassword:appUUID forService:appName account:kDeviceId];

выдерживает переустановку

доступен для нескольких приложенийодного разработчика в одной access group

kSecAttrAccessibleWhenUnlockedThisDeviceOnly

Page 12: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Device Id: MAC address if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { printf("Error: sysctl, take 1\n"); return NULL; }

if ((buf = malloc(len)) == NULL) { printf("Could not allocate memory. error!\n"); return NULL; }

if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { printf("Error: sysctl, take 2"); free(buf); return NULL; }

ifm = (struct if_msghdr *)buf; sdl = (struct sockaddr_dl *)(ifm + 1); ptr = (unsigned char *)LLADDR(sdl); NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X" *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr free(buf);

Page 13: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Device Id: MAC address

в Китае продавались iPhone 3GS накоторых был отключен Wi-Fi

всегда возвращает 02:00:00:00:00:00 на iOS 7+

Page 14: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Device Id: UIPasteboard

именованный буфер обмена

доступен всем приложениям по имени начтение и запись

persistent

Page 15: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Device Id: UIPasteboard

Page 16: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Device Id: UIPasteboard

iOS 7: pasteboardWithName:create:работает только для приложений в однойapplication group

кратковременная передача данных черезgeneral pasteboard

Page 17: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Официальные API

iOS 6+

identifierForVendor

advertisingIdentifier

Page 18: Андриан Буданцов_Секретные способы идентификации пользователей iOS

identifierForVendorOfficial iOS 6+ API

[[UIDevice currentDevice] identifierForVendor]

Одинаковый для одного AppStore-разработчика

AdHoc / Enterprise: одинаковый* id дляпохожих com.bundle (*iOS 6/7)

Разный для adhoc/app store сборок

может поменяться

Page 19: Андриан Буданцов_Секретные способы идентификации пользователей iOS

identifierForVendorможет поменятся

на nil (повторить вызов)

при переустановке последнего приложенияразработчика

при адпейте iOS (?)

в других случаях

Page 20: Андриан Буданцов_Секретные способы идентификации пользователей iOS

advertisingIdentifier[[ASIdentifierManager sharedManager] advertisingIdentifier]

в iOS 6 бетах был

[[UIDevice currentDevice] identifierForAdvertising]

из AdSupport.framework

advertisingTrackingEnabled

нужна причина использования

может поменяться

Page 21: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Отступление: хранение UUID

Значение 128 бит

Каноническое hex-представлениеhex 8-4-4-4-12, например:B704C214-EE76-47DB-8CA2-97A9FAD184D7

base64url (Base64 -_ вместо +/ )sA9kDM_tRlW0HmywjZCj8Q

экономия 38%

Page 22: Андриан Буданцов_Секретные способы идентификации пользователей iOS

idfv+keychain

сохраняет identifierForVendor в Keychainдля приложения

см. свой идентификатор

ничем не лучше обычного UUID

Page 23: Андриан Буданцов_Секретные способы идентификации пользователей iOS

UUID + iCloud

случайный UUID в iCloud

создается при первом запуске приложения

можно шарить между приложениями

считает уникальных iCloud пользователей

Page 24: Андриан Буданцов_Секретные способы идентификации пользователей iOS

iTunes User ID

FairPlay DRM, US Patent US7936873

Page 25: Андриан Буданцов_Секретные способы идентификации пользователей iOS

iTunes User ID

чем отличаются приложения купленныеразными пользователями?

%product%.app/SC_Info/%product%.sinf/SC_Info/%product%.supp

Page 26: Андриан Буданцов_Секретные способы идентификации пользователей iOS

iTunes User ID

Page 27: Андриан Буданцов_Секретные способы идентификации пользователей iOS

iTunes User ID

количество инсталляций у одногопользователя

список девайсов у пользователей

было: сопоставить iTunes комментарии(содержал dsId) и запуск приложения

Page 28: Андриан Буданцов_Секретные способы идентификации пользователей iOS

iTunes User ID

все еще доступен

но iOS7+ не дает прочитать файл

Page 29: Андриан Буданцов_Секретные способы идентификации пользователей iOS

StoreKit Receipt[[NSBundle mainBundle] appStoreReceiptURL]

единственный метод для которого неработает respondsToSelector:

%sandbox%/StoreKit/receipt

“Receipt Validation Programming Guide”

PKCS#7 контейнер со значениями в ASN.1

Page 30: Андриан Буданцов_Секретные способы идентификации пользователей iOS

StoreKit Receipt

Page 31: Андриан Буданцов_Секретные способы идентификации пользователей iOS

StoreKit + verifyReceipt

HTTP POST вhttps://buy.itunes.apple.com/verifyReceipt

Page 32: Андриан Буданцов_Секретные способы идентификации пользователей iOS

StoreKitOriginal Purchase Date

разрешение до секундыподходит большинству платныхприложениям

позволяет узнать по какой цене купиливаше приложение

борьба с AppStore пиратством

Page 33: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Original Purchase DateНемного уточнений

[[NSLocale currentLocale] localeIdentifier]

[[NSTimeZone localTimeZone] secondsFromGMT]

sysctlbyname("hw.machine", machine, &size, NULL, 0);

[[NSFileManager defaultManager] attributesOfFileSystemForPath:p error:&e]

Page 34: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Core Telephonylet carrier = CTTelephonyNetworkInfo().subscriberCellularProviderNSLog("country %@ network %@" , carrier.mobileCountryCode, carrier.mobileNetworkCode);

см. wikipedia:Mobile country code

у Украины действительно MCC = 255

carrierName = Carrier для неизвестныхоператоров

Page 35: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Кратковременнаяидентификация

Access Point BSSID

CFDictionaryRef CNCopyCurrentNetworkInfo(CFStringRef interfaceName)

Boot Time

int mib[2] = {CTL_KERN, KERN_BOOTTIME}; size_t size = sizeof(boottime); time_t now; time_t uptime = -1; (void)time(&now); if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec !=

Page 36: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Идентификация в Safari

Нужно для конверсий из браузера

REMOTE_ADDR

iOS версия

тип девайсаiPhone / iPad / iPod / retina

короткое время

Page 37: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Пиратские копии

AdHoc / Enterprise InHouse сборкинет Receipt

App Store пиратствоOriginal Purchase Date

Jailbreak-пиратствопроверка receipt / binary hash

Page 38: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Часто собираемаяинформация

Свой идентификатор

Advertiser Identifier

флаг "Pirated"

флаг "jailbroken"

имя оператора

Page 39: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Часто собираемаяинформация (2)

модель девайса

подключение к сети

разрешение экрана

громкость звука

свободное место

Page 40: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Идентификация

Свой идентификатор в Keychain

Advertiser Identifier для рекламы

Receipt для дополнительной информации

Page 41: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Вопросы

?

Page 42: Андриан Буданцов_Секретные способы идентификации пользователей iOS

Спасибо за внимание@andrianbdn • [email protected]