Проверить Ids устройства iPhone?

Согласно эта статья , equals и hashCode должна быть независимой от состояния. Если вы переопределили только первое, это плохо и может вызвать странные ошибки. У них должен быть контракт .

Самый простой способ - использовать ломбок - аннотируйте свой класс с помощью @EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) и полей, используемых по сравнению с @EqualsAndHashCode.Include.

9
задан bpapa 21 April 2009 в 14:30
поделиться

4 ответа

If theres a way to validate the Id then theres a way to create a real fake id.


I agree with Tyler comment, there is a way to create Ids (easy) and to validate them (also easy) but to create a "fake" id will require scanning the entire keyspace (hard) or stealing the private key that generated the key (that's how TLS in fact works). some my initial comment is not valid.

Never the less, this is not how the Apple device Id works, AFAIK they generate the id from various values id of the hardware (MAC address for example)

7
ответ дан 4 December 2019 в 15:26
поделиться

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

-1
ответ дан 4 December 2019 в 15:26
поделиться

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

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

6
ответ дан 4 December 2019 в 15:26
поделиться

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

Метод swizzling меняет местами два селектора (uniqueIdentifier и spoofUniqueIdentifier) ​​для класса (UIDevice). После swizzle последующие вызовы 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);
        }
2
ответ дан 4 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: