Проверить идентификаторы устройства iPhone? - PullRequest
9 голосов
/ 21 апреля 2009

Есть ли способ проверить идентификатор устройства iPhone? Я хочу принимать идентификаторы устройств, отправленные пользователями iPhone с помощью HTTP-запроса, и проверять, связаны ли они с легитимным устройством.

Ответы [ 6 ]

7 голосов
/ 22 апреля 2009

Если есть способ проверить Id, то есть способ создать настоящий поддельный идентификатор.


Я согласен с комментарием Тайлера, есть способ создать идентификаторы (легко) и проверить их (также легко), но для создания «поддельного» идентификатора потребуется сканирование всего пространства ключей (жесткий) или кража закрытого ключа, который сгенерировал ключ (вот как на самом деле работает TLS). некоторые мои первоначальные комментарии недействительны.

Тем не менее, это не то, как работает идентификатор устройства Apple, AFAIK они генерируют идентификатор из различных значений идентификатора оборудования (например, MAC-адрес)

6 голосов
/ 14 мая 2009

Чтобы проверить запрос, пришедший из вашего приложения, вы можете отправить UUID и хеш, где hash = SHA1 (UUID + SECRET_KEY_STORED_IN_APP). Затем выполните ту же хеш-функцию на стороне сервера и убедитесь, что они совпадают. Вы можете добавить метку времени в качестве одноразового номера, куда вы бы отправили UUID, метку времени, хеш с hash = SHA1 (UUID + SECRET_KEY_STORED_IN_APP + TIMESTAMP).

Это, конечно, не является доказательством отказа и имеет много ограничений, но затрудняет подделку UUID.

2 голосов
/ 12 августа 2010

В ответ на Мартина Гортона сторонние библиотеки не могут доверять UIDevice uniqueIdentifier - подделать это просто, используя метод Objective C.

Метод swizzling заменяет два селектора (uniqueIdentifier и spoofUniqueIdentifier) ​​на класс (UIDevice). После переворота последующие вызовы UIDevice uniqueIdentifier вернут поддельный UDID. Это может быть полезно для тестирования библиотек с UDID-ключами, для которых у вас нет действительного UDID.

вот пример кода из http://marccodes.posterous.com/method-swizzling-uidevice-to-spoof-udid:

#import <objc/runtime.h>

// swap a class's instance method selectors, we do this to overload existing methods in category declarations
void swizzleMethodsForClass(Class c, SEL origMethodSel, SEL newMethodSel)
    {
    NSLog(@"swizzling %@ instance methods: %@ -> %@", NSStringFromClass(c), 
        NSStringFromSelector(origMethodSel), NSStringFromSelector(newMethodSel));

    Method origMethod = class_getInstanceMethod(c, origMethodSel);
    Method newMethod = class_getInstanceMethod(c, newMethodSel);

    // check if method is inherited from superclass
    if(class_addMethod(c, origMethodSel, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
        class_replaceMethod(c, newMethodSel, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));

    // exchange un-subclassed method
    else
        method_exchangeImplementations(origMethod, newMethod);
    }   

@interface UIDevice (SpoofUDID)

@end

#define UDID_TO_SPOOF        @"e0101010d38bde8e6740011211af315301010223"

@implementation UIDevice (SpoofUDID)

// swizzle this instance method for UIDevice class
- (NSString *) spoofUniqueIdentifier
        {
        static NSString *spoofUDID = UDID_TO_SPOOF;
        NSLog(@"spoofing %@ instead of %@", spoofUDID, [[UIDevice currentDevice]
spoofUniqueIdentifier]);
        return spoofUDID;
        }

@end

// call this from your app delegate
- (void) initUDID
        {
        NSString *UDID = [[UIDevice currentDevice] uniqueIdentifier];
        NSLog(@"this is my old udid: %@", UDID);

        swizzleMethodsForClass([UIDevice class], @selector(uniqueIdentifier), @selector(spoofUniqueIdentifier));

        NSString *UDID2 = [[UIDevice currentDevice] uniqueIdentifier];
        NSLog(@"this is my new udid: %@", UDID2);
        }
0 голосов
/ 26 февраля 2016

для проверки UDID попробуйте следующее регулярное выражение ^([A-F0-9]{40})$ или вы можете пойти сюда и просто вставить его .

Если вы используете [[UIDevice currentDevice].identifierForVendor UUIDString] (что вам следует) - тогда это просто подсказка, посмотрите на регулярное выражение (^([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$) или вы можете вставить его сюда .

Надеюсь, это сэкономит вам время.

0 голосов
/ 12 января 2014

Нет документации или спецификации Apple, которая бы указывала расположение этой строки.

Только AFAIK Apple знает, какие UDID реальны, а какие ложны.

Образованным предположением будет то, что они состоят из 40 символов, состоящих из буквенно-цифровых символов. (А-f0-9)

Шаблон RegEx:

[a-z0-9]{40}
0 голосов
/ 22 апреля 2009

Если вы берете его напрямую, используя [[UIDevice currentDevice] uniqueIdentifier], а не запрашиваете его у пользователя, то нет никаких причин, по которым он не будет действительным идентификатором устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...