2012-01-14 10 views
1

デバイスのudid(iOS 5では廃止予定)で識別されるユーザーのデータベースがあります。 ではないデバイスを識別する新しい方法が必要ですは既にデータベースに存在する文字列を生成します。新しいデバイスの識別方法への移行

udidはSHA1(SerialNumber + IMEI + WiFiAddress + BluetoothAddress)でした。

デバイスを識別する新しい方法として、MD5(MACAddress)のような出力を使用することは安全ですか?私が読んだところでは、MD5とSHA-1が異なる長さの文字列(それぞれ128と160ビット)を出力するように思えますが、ここで何も見つからないことを確認しています。私は本当に重複する識別子で終わって欲しくない...

答えて

1

ちょうど前のものの代わりにSHA1(MAC | 0001)を使用してください。すでに存在するSHA1を作成する可能性は、SHA1アルゴリズム(衝突)の実際の問題を示すため、極端である可能性は低いです。注:私は、+は連結を意味すると私は考えました。連結として。

別の一意の識別子が必要な場合は、最後にカウンタを増やすことができます(文字またはその他の文字列、4バイトで試してください)。

MD5はおそらくこの目的のためには安全ですが、私はこの壊れたハッシュの使用を避けようとしています.ShA1(またはSHA-256へ移動)をそのまま使用してください。

+0

私はUDIDハッシュの一部であった以前の値にアクセスできません。私はMACアドレスがすでにそれ自身でユニークであると仮定します。私はMD5だけではなく、出力された文字列の長さがSHA1と異なるので、古い識別子と衝突しませんか? – samvermette

+0

同じこと:入力が異なる場合、ハッシュはあなたに一意の値を与えます。次に、MACはすでに一意の値です。したがって、MACアドレスよりも短い値が必要な場合、またはプライバシー上の理由でMACアドレスを保存しない場合にのみ、これを行います。ハッシュの出力からバイトを削除すると、明らかに衝突の可能性が増します。私は答えを編集します。 –

+0

SHA1(MAC)の代わりに 'SHA1(MAC | 0001)'を使うのはなぜですか?あなたは "壊れたハッシュ"と言ったときに何を言いましたか? MD5エンコーディングアルゴリズム? – samvermette

0

あなたはこのコードを参照して、デバイスのMACアドレスを取得する方法がわからない場合だけ..デバイスのMACアドレス..独自のを使用 - ここ

#include <sys/socket.h> 
#include <sys/sysctl.h> 
#include <net/if.h> 
#include <net/if_dl.h> 

- (NSString *)getMacAddress 
{ 
    int     mgmtInfoBase[6]; 
    char    *msgBuffer = NULL; 
    size_t    length; 
    unsigned char  macAddress[6]; 
    struct if_msghdr *interfaceMsgStruct; 
    struct sockaddr_dl *socketStruct; 
    NSString   *errorFlag = NULL; 

    // Setup the management Information Base (mib) 
    mgmtInfoBase[0] = CTL_NET;  // Request network subsystem 
    mgmtInfoBase[1] = AF_ROUTE;  // Routing table info 
    mgmtInfoBase[2] = 0; 
    mgmtInfoBase[3] = AF_LINK;  // Request link layer information 
    mgmtInfoBase[4] = NET_RT_IFLIST; // Request all configured interfaces 

    // With all configured interfaces requested, get handle index 
    if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0) 
    errorFlag = @"if_nametoindex failure"; 
    else 
    { 
    // Get the size of the data available (store in len) 
    if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0) 
     errorFlag = @"sysctl mgmtInfoBase failure"; 
    else 
    { 
     // Alloc memory based on above call 
     if ((msgBuffer = malloc(length)) == NULL) 
     errorFlag = @"buffer allocation failure"; 
     else 
     { 
     // Get system information, store in buffer 
     if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0) 
      errorFlag = @"sysctl msgBuffer failure"; 
     } 
    } 
    } 

    // Befor going any further... 
    if (errorFlag != NULL) 
    { 
    NSLog(@"Error: %@", errorFlag); 
    return errorFlag; 
    } 

    // Map msgbuffer to interface message structure 
    interfaceMsgStruct = (struct if_msghdr *) msgBuffer; 

    // Map to link-level socket structure 
    socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1); 

    // Copy link layer address data in socket structure to an array 
    memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6); 

    // Read from char array into a string object, into traditional Mac address format 
    NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
           macAddress[0], macAddress[1], macAddress[2], 
           macAddress[3], macAddress[4], macAddress[5]]; 
    NSLog(@"Mac Address: %@", macAddressString); 

    // Release the buffer memory 
    free(msgBuffer); 

    return macAddressString; 
} 

は同じトピックに関する私のブログの記事である - http://www.makebetterthings.com/iphone/how-to-uniquely-identify-an-ios5-device/

+0

MACアドレスを取得する方法はすでに分かっているはずです。私の質問は、MD5のMACアドレスが以前のudidと衝突する可能性があるということです。 – samvermette

+0

MACアドレスをMD5することで全く新しいことができます。それはあなたの以前のudidsと衝突しません – Saurabh

関連する問題