web-dev-qa-db-ja.com

UUIDからどのような種類のデータを抽出できますか?

Uuidのバージョン番号を簡単に抽出できることを知っています。タイムスタンプ、MACアドレスなどの情報を抽出する信頼できる方法はありますか?

ありがとう!

23
Chris Frost

標準準拠のUUIDは、いくつかのバリアントの1つである可能性があり、次のようになります。

AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF

DDDD部分の最初の(16進数)桁がバリアントを決定します。

8,9、A、Bのいずれかである場合は、現在の仕様に準拠しています(0〜7は下位互換性のために予約され、C、DはMicrosoft用に予約され、E、Fは将来の使用のために予約されています)

現在の仕様に準拠している場合は、UUIDバージョンを決定するCCCCパーツの最初の桁を確認してください。

  1. 一意またはランダムなホスト識別子(MAC)を使用した時間ベース
  2. DCEセキュリティバージョン(POSIX UIDを使用)
  3. 名前ベース(MD5ハッシュ)
  4. ランダム
  5. 名前ベース(SHA-1ハッシュ)

バージョン4は単純にランダムに選択されます。

バージョン3と5は、いくつかのビットをハッシュして破棄することによって生成されます。つまり、基本的に、バージョン3から情報を回復する機会はありません。ビルド方法の詳細は、 RFC4122 または ID Generator Webページ にあります。

バージョン2のUUIDが見つからなかったため、データの抽出方法を確認しませんでした。

バージョン1は、タイムスタンプと現在のホストMACアドレスから生成されます。 (MACアドレスの「ブロードキャスト/マルチキャスト」ビットを設定した場合、標準では代わりにランダムアドレスを使用することもできます。)

次のPerlは、バージョン1のuuidからMACアドレスと時刻を解析します。

my $uuid="AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF";
$uuid=~tr/-//d;
my $time_low=hex substr($uuid,2* 0,2*4);
my $time_mid=hex substr($uuid,2* 4,2*2);
my $version =hex substr($uuid,2* 6,1);
my $time_hi =hex substr($uuid,2* 6+1,2*2-1);

my $time=($time_hi*(2**16)+$time_mid)*(2**32)+$time_low;
my $epoc=int($time /10000000) - 12219292800;
my $nano=$time-int($time/10000000)*10000000;

my $clk_hi  =hex substr($uuid,2* 8,2*1);
my $clk_lo  =hex substr($uuid,2* 9,2*1);
my $node    =substr($uuid,2*10,2*6);

$node=~/^(..)(..)(..)(..)(..)(..)$/ || die;
$node="$1:$2:$3:$4:$5:$6";

print "time: ",scalar localtime $epoc," +",$nano/10000,"ms\n";
print "clock id: ",$clk_hi*256+$clk_lo,"\n";
print "Mac: $node\n";

my $byte=hex $1;
if(hex($1)&1){
    print "broadcast/multicast bit set.\n";
};

最後になりましたが、たとえば GPTパーティション のように、いくつかのUUIDが割り当てられています。

46
Sec

UUIDの種類によっては、完全にランダムビットから生成されるか、タイムスタンプベースであるか、MACアドレスに基づいている可能性があるため、必ずしも信頼できる方法ではありません。したがって、その情報の一部を取得できる場合がありますが、何かを取得できることを保証することはできません。

これに関する公式のリファレンスは RFC 4122 です。これは、データを抽出するのに十分な情報を提供するはずですが、あまり信頼するべきではありません。

8
Daniel Pryden

OSSP uuidツール はすべてのバージョンのUUIDをデコードできます。 DebianベースのLinuxシステムでは、apt-get install uuidを使用してインストールできます。他のディストリビューションの場合、パッケージ名が異なる場合があります。

UUIDをデコードするには、-d(デコード)フラグを使用します。

uuid -d AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF

バージョン1のUUIDの場合、これによりMACアドレスとタイムスタンプが提供されます。これはv1uuidに含まれているためです。

5
Luc

uuidのバージョン番号を簡単に抽出できることはわかっています。タイムスタンプ、MACアドレスなどの情報を抽出する信頼できる方法はありますか?

はい、そしてはい。 UUIDがバージョン1またはバージョン2の場合(RFC 4122で説明されているように)。解析可能なタイムスタンプ(およびランダム値)を含む「COMB」と呼ばれる代替(非RFC 4122)バージョン4もあり、作成日時を明らかにすることができます。

ボーナス:Mahonri Moriancumerの IDおよびGUIDジェネレーターおよびフォレンジック

4

バージョン1のUUIDの場合、MACアドレスは最後の12桁の16進数になります。

3
James Cronen

Uuidのバージョンを確認することもできますが、それはUuidが有効であることが確実な場合にのみ信頼できます( http://tools.ietf.org/html/rfc4122 を参照)。このバージョンでは、使用しているUuidの種類がわかり、それを使用して特定の情報を抽出できます。

2
Stephen Newell