您可以从UUID中提取哪些数据?

时间:2009-11-10 17:13:43

标签: uuid

我知道我们可以轻松提取uuid版本号。有没有可靠的方法来提取时间戳,MAC地址等信息?

谢谢!

6 个答案:

答案 0 :(得分:43)

符合标准的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哈希)
  6. 版本4只是随机选择。

    版本3和5是通过散列并丢弃一些位来生成的,这意味着您基本上没有机会从中恢复任何信息。有关如何构建它的详细信息,请参阅RFC4122UUID Generator webpage

    我找不到任何版本2的UUID,所以我没有检查如何提取数据。

    版本1是从时间戳和当前主机MAC地址生成的。 (如果您设置MAC地址的“广播/多播”位,该标准也允许使用随机地址。)

    以下perl snipped从版本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

答案 1 :(得分:7)

不一定是可靠的方式,因为根据UUID的类型,它可以完全从随机位生成,或者基于时间戳,或者基于MAC地址。所以你可以获得一些信息,但你不能保证你可以得到任何东西。

这方面的官方参考是RFC 4122,它应该可以为您提供足够的信息来提取数据,尽管您可能不应该过分依赖它。

答案 2 :(得分:3)

如果是版本1 UUID,则MAC地址将是最后十二个十六进制数字。

答案 3 :(得分:3)

我知道我们可以轻松提取uuid版本号。有没有可靠的方法来提取时间戳,MAC地址等信息?

是的,是的;如果UUID是版本1或版本2(如RFC 4122中所述)。还有一个替代(非RFC 4122)版本4,被称为“COMB”,其中包括可以解析的时间戳(以及随机值),并且可以显示创建日期/时间。

奖金:Mahonri Moriancumer的UUID and GUID Generator and Forensics

答案 4 :(得分:3)

OSSP uuid tool可以解码所有版本的UUID。在基于Debian的Linux系统上,您可以使用apt-get install uuid进行安装;对于其他发行版,包名称可能不同。

要解码UUID,请使用-d(解码)标志:

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

对于版本1 UUID,它提供了MAC地址和时间戳 - 因为它是v1 uuid中的内容。

答案 5 :(得分:2)

您可以查看Uuid的版本,但只有在您确定Uuid有效时才能信任(请参阅http://tools.ietf.org/html/rfc4122)。该版本将告诉您你拥有什么样的Uuid,并使用它可以提取特定的信息。