我知道我们可以轻松提取uuid版本号。有没有可靠的方法来提取时间戳,MAC地址等信息?
谢谢!
答案 0 :(得分:43)
符合标准的UUID可能是多种变体之一,它看起来像这样:
AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF
DDDD部分的第一个(十六进制)数字决定了变体。
如果它是8,9,A,B之一,则符合当前规范 (0-7保留用于向后兼容,C,D保留给Microsoft,E,F保留供将来使用)
如果符合当前规范,请检查确定UUID版本的CCCC部件的第一个数字:
版本4只是随机选择。
版本3和5是通过散列并丢弃一些位来生成的,这意味着您基本上没有机会从中恢复任何信息。有关如何构建它的详细信息,请参阅RFC4122或UUID 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,并使用它可以提取特定的信息。