2009-04-21 15 views
9

¿Hay alguna manera de validar la identificación de un dispositivo iPhone? Deseo poder aceptar identificadores de dispositivos enviados por usuarios de iPhone a través de una solicitud HTTP y validar que están vinculados a un dispositivo legítimo.Validar iPhone dispositivo Ids?

+1

No conozco ninguno. ¿Has intentado preguntar en las placas de desarrollo de Apple? –

+0

Pensé que las notificaciones automáticas podrían ser una forma de validar un UDID, pero no es así: https://devforums.apple.com/message/50658#50658 – bbrown

+0

AFAIK Puedes hacer la validación de longitud para 40 caracteres –

Respuesta

6

Si hay una manera de validar el Id entonces hay una manera de crear una identificación falsa real.


Estoy de acuerdo con comentario Tyler, hay una manera de crear ID (fácil) y validarlos (también es fácil) sino para crear un identificador de "falso" requerirá el escaneo de todo el espacio de claves (duro) o robar la clave privada que generó la clave (así es como funciona TLS). algunos mi comentario inicial no es válido.

Nunca

embargo, esto no es como el dispositivo de Apple funciona Id, que yo sepa que genere el id de varios valores de ID del hardware (dirección MAC por ejemplo)

+2

¿Y si hubiera una central? DB de IDS válidos? –

+2

Probablemente exista, pero Apple nunca te dejaría acercarte. No conozco ninguna compañía (importante) que alguna vez te haya permitido navegar por sus números de serie. –

+1

Esta declaración se basa en un malentendido sobre cómo funciona la criptografía moderna. La criptografía moderna se basa en la idea de que hay funciones que son fáciles de calcular pero que son difíciles de invertir. Por ejemplo, en la clave pública de cifrado, cualquiera puede encriptar un mensaje, pero solo el destinatario puede descifrarlo. Si solo una pequeña fracción de todos los UDID son válidos, sería lento producir los falsos. – Tyler

-1

Si lo agarras directamente utilizando [[UIDevice currentDevice] uniqueIdentifier] en lugar de solicitar un usuario para él, entonces no hay ninguna razón por la cual no sería una identificación de dispositivo legítima.

+3

Creo que bpapa está tratando de evitar que clientes no-iphone escritos por usuarios hostiles accedan a su servicio. –

+1

Es posible que desee intentar generar algún tipo de firma para asegurarse de que el mensaje no se haya falsificado. Por ejemplo, consulte el mecanismo de firma de Flickr (# 8 en esta página: http://flickr.com/services/api/auth.spec.html) –

+0

Tenga cuidado con la vulnerabilidad en el método de Flickr. Vea este documento para más detalles, pero el TL; DR debe usar algo como sha1 sobre md5 para evitar falsificaciones potenciales. http://netifera.com/research/flickr_api_signature_forgery.pdf –

6

Para validar una solicitud provenía de su aplicación, podía enviar el UUID y un hash, donde hash = SHA1 (UUID + SECRET_KEY_STORED_IN_APP). Luego haga la misma función hash en el lado del servidor y verifique que coincidan. Podría agregar un sello de tiempo como un nonce, donde enviaría UUID, timestamp, hash con hash = SHA1 (UUID + SECRET_KEY_STORED_IN_APP + TIMESTAMP).

Esto ciertamente no es a prueba de fallos y tiene muchas limitaciones, pero hace que sea más difícil falsificar un UUID.

+0

Si hay un secreto almacenado en el binario de la aplicación, se puede obtener y luego compartir. La única manera de obtener un secreto de manera segura sería en el lanzamiento inicial, llamar a un servicio web a través de SSL, obtener una clave y almacenarla en el llavero del teléfono. Pero en el momento en que haces eso, alguien más puede imitar tu aplicación y obtener la clave también. – bbrown

+0

toda la seguridad es una compensación de costo beneficio. Esto es mejor que el texto simple, que a su vez es mejor que nada. –

+0

¿No sería la función del lado del servidor SHA1 (UUID + HASH + TIMESTAMP), no la clave secreta, cómo podría el servidor obtener eso? @baalexander – Emil

2

En respuesta a Martin Gorton, las bibliotecas de terceros no pueden confiar en UIDevice uniqueIdentifier; es trivial suplantar esto utilizando el método Objective C swizzling.

Método Swizzling intercambia dos selectores (uniqueIdentifier y spoofUniqueIdentifier) ​​para una clase (UIDevice). Después del swizzle, las llamadas subsiguientes a UIDevice uniqueIdentifier devolverán el UDID falso. Esto puede ser útil para probar bibliotecas con clave UDID para las que no tiene un UDID válido.

aquí algunos ejemplos de código de 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

No hay documentación de manzana o pliego de condiciones que especifica el diseño de esta cadena.

AFAIK solo Apple sabe qué UDID son reales y cuáles son falsos.

Una conjetura fundada sería que tienen 40 caracteres de longitud, que consisten en caracteres alfanuméricos. (A-f0-9)

patrón de expresión:

[a-z0-9]{40} 
0

para validar UDID intente siguiente expresión regular ^([A-F0-9]{40})$ o usted podría ir here and just paste it.

Si está utilizando [[UIDevice currentDevice].identifierForVendor UUIDString] (que debería) - entonces es sólo un GUID, tienen a look at this expresión regular es (^([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})$) o podría paste it here.

Espero que esto te ahorre algo de tiempo.

Cuestiones relacionadas