2009-04-21 7 views
9

iPhoneデバイスIDを検証する方法はありますか? iPhoneのユーザーからHTTPリクエストで送信されたデバイスIDを受け入れ、正当なデバイスに接続されていることを検証できるようにしたいと考えています。iPhoneデバイスのIDを検証しますか?

+1

私はそれを認識していません。あなたはAppleのデベロッパーボードについて聞いてみましたか? –

+0

私はプッシュ通知がUDIDを検証する方法かもしれないと思っていましたが、そうではありません:https://devforums.apple.com/message/50658#50658 – bbrown

+0

AFAIK 40文字の長さの検証を行うことができます –

答えて

6

本当にIDを検証する方法であれば、実際の偽のIDを作成する方法があります。


私はタイラーのコメントに同意する、のIds(簡単)を作成する方法がありますし、(も簡単に)それらを検証するが、「偽」のIDを作成するために、全体の鍵空間(ハード)をスキャンするか、盗む必要になりますキーを生成したプライベートキー(TLSの実際の動作) 私の最初のコメントは無効です。

決して少なくは、これはあなたが直接[[UIDevice currentDevice] uniqueIdentifier]を使用してというよりも促しそれをつかむ場合(例えばMACアドレス)

+2

中央有効なIDSのDBですか? –

+2

おそらくありますが、リンゴは決して近くに近づけないでしょう。 シリアルナンバーを閲覧できるようにした(主要な)会社はありません。 –

+1

この文は、現代の暗号がどのように機能するかの誤解に基づいています。現代の暗号は、計算が簡単ではあるが逆転することの難しい機能があるという考えに基づいています。たとえば、公開鍵暗号では、誰でもメッセージを暗号化できますが、受信者だけが復号化できます。すべてのUDIDのほんの一部が有効であれば、擬似UDIDを生成するには時間がかかるでしょう。 – Tyler

-1

Idが働くAppleデバイスは、私の知る限り、彼らはハードウェアの様々な値をIDからIDを生成する方法ではありませんそのためにユーザーが正当なデバイスIDにならない理由はありません。

+3

私はbpapaが自分のサービスにアクセスする敵対的なユーザーによって書かれた非iphoneクライアントを停止しようとしていると思います。 –

+1

メッセージが偽造されていないことを確認するために、何らかの種類の署名を生成してみてください。たとえば、Flickrの署名メカニズム(このページの#8:http://flickr.com/services/api/auth.spec.html)を参照してください。 –

+0

Flickrの方法の脆弱性に注意してください。詳細については、このペーパーを参照してください。TL; DRは、潜在的な偽造を避けるために、md5よりもsha1のようなものを使用します。 http://netifera.com/research/flickr_api_signature_forgery.pdf –

6

あなたのアプリからのリクエストを確認するには、UUIDとハッシュを送信することができます。ここで、hash = SHA1(UUID + SECRET_KEY_STORED_IN_APP)です。次に、サーバー側で同じハッシュ関数を実行し、一致することを確認します。タイムスタンプをナンスとして追加すると、UUID、タイムスタンプ、ハッシュ= SHA1(UUID + SECRET_KEY_STORED_IN_APP + TIMESTAMP)のハッシュを送信することができます。

これは確かに誤りではなく、多くの制限がありますが、UUIDを偽装するのが難しくなります。

+0

秘密情報がアプリケーションバイナリに格納されている場合は、それを取得して共有することができます。秘密を安全に取得する唯一の方法は、初回起動時、SSL経由のWebサービスの呼び出し、鍵の取得、および電話のKeychainへの格納です。しかし、あなたがそれを行うと、他の誰かがあなたのアプリを模倣し、キーを取得することもできます。 – bbrown

+0

すべてのセキュリティはコストメリットのトレードオフです。これは何よりも優れている平文よりも優れています。 –

+0

サーバ側の機能は秘密鍵ではなく、SHA1(UUID + HASH + TIMESTAMP)ではないでしょうか、サーバはどのようにそれを取得できますか? @baalexander – Emil

2

Martin Gortonに対する回答として、サードパーティのライブラリはUIDeviceのuniqueIdentifierを信頼できません。Objective Cのメソッドスウィズリングを使用してこれを偽装するのは簡単です。

メソッドswizzlingは、クラス(UIDevice)に対して2つのセレクタ(uniqueIdentifierとspoofUniqueIdentifier)をスワップします。スウィズルの後、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

この文字列にレイアウトを指定なしリンゴのドキュメントや仕様がありません。

AFAIKは、どのUDIDが本当であり、どれが偽であるかを知っています。

英数字で構成された長さは40文字です。 (-f0-9)

正規表現パターン:

[a-z0-9]{40} 
0

正規表現^([A-F0-9]{40})$ またはあなたがhere and just paste itを行くことができるが、以下試してくださいUDIDを検証します。

あなたが[[UIDevice currentDevice].identifierForVendor UUIDString]を使用している場合は、(そのあなたがすべき) - それはちょうどGUIDだ、a look at this 正規表現は(^([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})$) であるか、paste it hereを可能性があります。

希望すれば、時間を節約できます。

関連する問題