2009-11-10 41 views
14

我知道我們可以輕鬆提取uuid版本號。有沒有可靠的方法來提取信息,如時間戳,MAC地址?您可以從UUID中提取什麼樣的數據?

謝謝!

+1

你問的是什麼UUID的味道,以及什麼語言?如果沒有這些信息,我會說你必須知道如何生成UUID(版本)才能知道可以提取哪些內容。 – 2015-11-24 19:27:31

回答

2

您可以查看Uuid的版本,但只有在確定Uuid有效時才能信任該版本(請參閱http://tools.ietf.org/html/rfc4122)。該版本會告訴你你有什麼樣的Uuid,並用它來提取特定的信息。

7

不一定是一種可靠的方式,因爲根據UUID的種類,它可能完全由隨機位生成,或者是基於時間戳的,或者基於MAC地址。所以你可能會得到一些信息,但你不能保證你能得到任何東西。

對此的官方參考是RFC 4122,它應該可能會爲您提供足夠的信息來提取數據,儘管您可能不應該過度依賴它。

3

如果是版本1的UUID,則MAC地址將是最後十二個十六進制數字。

+1

但是,確定任意UUID格式的字節塊是否實際上是版本1 UUID或只是隨機數據的方式並不一定可靠。所以充其量你必須把你的MAC地址拿回來。 – 2009-11-10 17:19:28

+0

@DanielPryden假設正在遵循標準,UUID中包含UUID版本號。 v1 UUID始終爲xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx。見https://en.wikipedia.org/wiki/Universally_unique_identifier#Format – YeB 2018-01-12 15:26:57

+0

@YeB:你說的沒錯。但我的觀點是:如果你看到*看起來像是一個UUID的字節塊,你不能確定它*是一個UUID,因此版本字段不一定是可靠的。也就是說:如果您嘗試從UUID中提取數據,則需要注意攻擊者可能預先確定其發送的位,而與標準所說的內容無關。這意味着,正如我八年多前所說的那樣:「充其量,你最好不得不把MAC地址拿回來」。 – 2018-01-12 15:57:46

33

甲符合標準的UUID可以是幾種變體之一,它看起來像這樣:

AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF

的DDDD部分的第一(十六進制)位確定變種。

如果它是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是通過哈希生成的,並丟掉了一些位,這意味着您基本沒有機會從中恢復任何信息。有關如何構建它的詳細信息可在RFC4122UUID Generator webpage中找到。

我找不到任何版本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"; 
}; 

最後但並非最不重要的,有幾個指定的UUID,例如用於GPT partitions

+0

您在第二行代碼中有一個錯誤。它應該是: $ uuid =〜s/- // g; 否則,該腳本將只會替換第一次出現的' - '。除此之外,感謝您分享此代碼。 – metator 2013-10-03 16:35:08

+0

@metator:第二行可能意味着音譯刪除所有短劃線:'-'。在Perl 5.18中正確的代碼是'$ uuid =〜tr/- // d;'(相當於Unix命令'tr -d -')。同樣,每行都縮進四個空格,這在複製代碼時很煩人。 – pabouk 2014-11-25 14:50:00

+0

我在RFC 4412中沒有看到任何建議你對變體編碼的解釋是正確的。它只用三位來確定變體,而不是一個整數。 – Melab 2016-08-13 18:06:31

3

我知道我們可以很容易地提取uuid版本號。有沒有可靠的方法來提取信息,如時間戳,MAC地址?

是的,是的;如果UUID是版本1或版本2(如RFC 4122中所述)。還有一個備用(非RFC 4122)版本4,被稱爲「COMB」,其中包含可以解析的時間戳(以及隨機值),並且可以顯示創建日期/時間。

獎勵:Mahonri Moriancumer的UUID and GUID Generator and Forensics

1

OSSP uuid tool可以解碼所有版本的UUID。在基於Debian的Linux系統上,您可以使用apt-get install uuid進行安裝;對於其他發行版,軟件包名稱可能會有所不同。

要解碼UUID,使用-d(解碼)標誌:

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

對於版本1點的UUID,這給MAC地址和時間戳 - 因爲那是什麼在V1 UUID。

相關問題