2009-04-21 33 views
9

Có cách nào để xác thực ID thiết bị iPhone không? Tôi muốn có thể chấp nhận ID thiết bị được gửi từ người dùng iPhone thông qua yêu cầu HTTP và xác thực rằng chúng được gắn với thiết bị hợp pháp.Xác thực Id thiết bị iPhone?

+1

Tôi không biết một. Bạn đã thử hỏi trên các bảng dev của Apple chưa? –

+0

Tôi nghĩ rằng thông báo đẩy có thể là một cách để xác thực UDID, nhưng không phải là: https://devforums.apple.com/message/50658#50658 – bbrown

+0

AFAIK Bạn có thể xác nhận độ dài cho 40 ký tự –

Trả lời

6

Nếu có cách để xác thực Id thì có cách tạo id giả thực sự.


Tôi đồng ý với Tyler nhận xét, có một cách để tạo ra Id (dễ dàng) và để xác nhận họ (cũng dễ dàng) nhưng để tạo ra một "giả" id sẽ yêu cầu quét toàn bộ keyspace (cứng) hoặc ăn cắp khóa riêng đã tạo khóa (đó là cách TLS thực tế hoạt động). một số nhận xét ban đầu của tôi không hợp lệ.

Không bao giờ là ít hơn, đây không phải là cách mà thiết bị của Apple Id hoạt động, AFAIK họ tạo ra id từ các giá trị khác nhau id của phần cứng (địa chỉ MAC ví dụ)

+2

nếu có trung tâm DB của IDS hợp lệ? –

+2

Có lẽ có, nhưng táo sẽ không bao giờ để bạn đến gần. Tôi không biết bất kỳ công ty lớn nào đã từng cho phép bạn duyệt số sê-ri của họ. –

+1

Tuyên bố này dựa trên sự hiểu lầm về cách thức hoạt động của mật mã hiện đại. Mật mã hiện đại dựa trên ý tưởng rằng có những hàm dễ tính toán nhưng khó đảo ngược. Ví dụ, trong mật mã khóa công khai, bất cứ ai cũng có thể mã hóa một tin nhắn, nhưng chỉ người nhận mới có thể giải mã nó. Nếu chỉ một phần nhỏ của tất cả UDID là hợp lệ, thì sẽ mất nhiều thời gian để tạo ra những cái giả. – Tyler

-1

Nếu bạn lấy nó trực tiếp sử dụng [[UIDevice currentDevice] uniqueIdentifier] hơn là thúc đẩy một người dùng cho nó sau đó không có lý do tại sao nó sẽ không được một ID thiết bị hợp pháp.

+3

Tôi nghĩ rằng bpapa đang cố gắng ngăn chặn các khách hàng không phải iphone được viết bởi những người dùng thù địch truy cập vào dịch vụ của mình. –

+1

Anh ấy có thể muốn thử tạo ra một số loại chữ ký để đảm bảo thư không bị giả mạo. Ví dụ, xem cơ chế ký tên của Flickr (# 8 trên trang này: http://flickr.com/services/api/auth.spec.html) –

+0

Xem phần lỗ hổng trong phương thức của Flickr. Xem bài viết này để biết chi tiết, nhưng TL, DR là sử dụng một cái gì đó như sha1 trên md5 để tránh giả mạo tiềm năng. http://netifera.com/research/flickr_api_signature_forgery.pdf –

6

Để xác thực yêu cầu đến từ ứng dụng của bạn, bạn có thể gửi UUID và băm, trong đó hàm băm = SHA1 (UUID + SECRET_KEY_STORED_IN_APP). Sau đó, thực hiện cùng chức năng băm ở phía máy chủ và xác minh chúng khớp nhau. Bạn có thể thêm dấu thời gian vào dưới dạng nonce, nơi bạn muốn gửi UUID, dấu thời gian, băm với hàm băm = SHA1 (UUID + SECRET_KEY_STORED_IN_APP + TIMESTAMP).

Điều này chắc chắn không phải là bằng chứng không thành công và có nhiều hạn chế, nhưng liệu có khó khăn hơn khi giả mạo UUID không.

+0

Nếu có một bí mật được lưu trữ trong ứng dụng nhị phân, nó có thể được nhận và sau đó chia sẻ. Cách duy nhất để có được một bí mật một cách an toàn sẽ là lúc khởi động ban đầu, gọi một dịch vụ Web qua SSL, lấy chìa khóa và lưu trữ nó trong Keychain của điện thoại. Nhưng phút bạn làm điều đó, một người khác có thể bắt chước ứng dụng của bạn và lấy chìa khóa. – bbrown

+0

tất cả bảo mật là một giao dịch lợi ích chi phí. Điều này là tốt hơn so với bản rõ đó là lần lượt tốt hơn so với không có gì. –

+0

Không phải chức năng phía máy chủ sẽ là SHA1 (UUID + HASH + TIMESTAMP), không phải là khóa bí mật, làm thế nào máy chủ có thể nhận được điều đó? @baalexander – Emil

2

Để trả lời Martin Gorton, thư viện của bên thứ ba không thể tin tưởng UIDevice uniqueIdentifier- nó là tầm thường để giả mạo điều này bằng cách sử dụng phương pháp Objective C.

Phương thức hoán đổi giao dịch hoán đổi hai bộ chọn (uniqueIdentifier và spoofUniqueIdentifier) ​​cho một lớp (UIDevice). Sau sự lộn xộn, các cuộc gọi tiếp theo tới UIDevice uniqueIdentifier sẽ trả về UDID giả mạo. Điều này có thể hữu ích khi kiểm tra các thư viện có khóa UDID mà bạn không có UDID hợp lệ.

đây là một số mẫu mã từ 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

Không có tài liệu hướng dẫn táo hoặc đặc điểm kỹ thuật mà định bố cục để chuỗi này.

Chỉ AFAIK Apple biết UDID nào là có thật và sai là gì.

Dự đoán được giáo dục có thể dài 40 ký tự, bao gồm các ký tự chữ và số. (A-f0-9)

RegEx mẫu:

[a-z0-9]{40} 
0

để xác nhận UDID thử sau regex ^([A-F0-9]{40})$ hoặc bạn có thể đi here and just paste it.

Nếu bạn đang sử dụng [[UIDevice currentDevice].identifierForVendor UUIDString] (mà bạn nên) - sau đó nó chỉ là một guid, có a look at this regex là (^([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})$) hoặc bạn có thể paste it here.

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian.

Các vấn đề liên quan