たまには技術的な話を。

服LIVEもver3.0での新機能の一つでは、入力時のデータ(個人の不快指数と実際の天気情報から計算された不快指数)を利用したものがあり、それを分析したりしたいので、個人を特定するためのIDを利用しなければいけなくなりました。

そこでまず候補として上がったのが UDID: Unique Device Identifier

簡単に言えば、端末情報。その携帯それぞれが持ってる固有のIDですね。

iPhoneに関しては以下の2行書けば取得できる
UIDevice *device = [UIDevice currentDevice];
NSString *udid = [device uniqueIdentifier];


しかし、このUDIDはセキュリティのことを考えたら、まず使ってはいけないID。

みんなが普通に使ってれば何も危険なことはないのだが、一人でも危険な人がいればこのIDが危険なものになる。

例えば、このIDを使って位置情報を保存したとしよう。

そして、引き出す時にそのUDIDを用いてそのユーザの位置情報を引き出すとすると、もし他の知らない誰かがあなたのUDIDを知っていたら、あなたがどこにいるのか突き止められるというわけである。

しかも、この世には「UDID Faker」というアプリまであり、jailbreakしたiPhone OSで使用でき、指定したアプリに対してUDIDを差し替えることができる。

おそろしや・・・


そこで、UDIDのセキュリティリスクを回避するためにあるのがUUID:Universally Unique Identifier

乱数IDを生成し、文字通り世界に一つのIDを作れる。

UUIDは16バイトの数値で表され、「550e8400-e29b-41d4-a716-446655440000」のように表現される。

よく利用されるのは乱数に基づくUUID(UUID version 4)で、この形式のUUIDは2の122乗通り(およそ5.3×10の36乗通り)存在する。

ちなみに、10の36乗は・・・http://homepage2.nifty.com/NG/unit/sub.htm

なので、このUUIDをアプリ起動時に一度生成するようにプログラムに組み込めば、それと同じIDを探すことはまず不可能。(運営側が教えない限り)


じゃ、実装はどうやってやるのかって?

たったこれだけです。
(ここを参照しました。)

- (NSString*) getUUID
{
 //create a new UUID
CFUUIDRef uuidObj = CFUUIDCreate(nil);
//get the string representation of the UUID
NSString *uuidString = (NSString*)CFUUIDCreateString(nil, uuidObj);
CFRelease(uuidObj);
return [uuidString autorelease];
}





以上、IDを扱うエンジニアなら知っておきたい情報でした。


ちなみに、ここを見るとより詳しく理解できます。

http://takagi-hiromitsu.jp/diary/20100619.html#p01