Я знаю, что мы могли бы легко извлечь номер версии uuid. Есть ли надежный способ извлечения информации, такой как метка времени, MAC-адрес?
Спасибо!
Я знаю, что мы могли бы легко извлечь номер версии uuid. Есть ли надежный способ извлечения информации, такой как метка времени, MAC-адрес?
Спасибо!
Стандартно-совместимый UUID может быть одним из нескольких вариантов, он выглядит так:
AAAAAAAA-BBBB-КЦИК-DDDD-FFFFFFFFFFFF
Первая (шестнадцатеричная) цифра части DDDD определяет вариант.
Если это один из 8,9, A, B соответствует текущей спецификации (0-7 зарезервированы для обратной совместимости, C, D зарезервированы для Microsoft, а E, F зарезервированы для будущего использования)
Если он соответствует текущей спецификации, проверьте первую цифру части CCCC, которая определяет версию UUID:
Версия 4 выбирается случайным образом.
Версии 3 и 5 генерируются путем хэширования и отбрасывания некоторых битов, что означает, что у вас практически нет возможности восстановить какую-либо информацию из него. Подробности о том, как его построить, можно найти в RFC4122 или в Веб-страница генератора UUID.
Я не смог найти UUID версии 2, поэтому я не проверял, как извлекать данные.
Версия 1 генерируется на основе временного штампа и текущего MAC-адреса хоста. (Стандарт также позволяет вместо этого использовать случайный адрес, если вы установите бит "широковещательная/многоадресная передача" MAC-адреса.)
Следующий perl snipped анализирует MAC-адрес и Time из версии 1 uuid:
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.
Не обязательно надежный способ, потому что в зависимости от типа UUID он может генерироваться полностью из случайных битов или основываться на временной шкале или основываться на MAC-адресе. Таким образом, вы можете получить часть этой информации, но вы не можете гарантировать, что можете получить что-нибудь.
Официальная ссылка на это RFC 4122, которая, вероятно, должна предоставить вам достаточно информации для извлечения данных, хотя вы, вероятно, не должны полагаться на это слишком тяжело.
Если это UUID версии 1, MAC-адрес будет последним двенадцать шестнадцатеричных цифр.
Я знаю, что мы могли бы легко извлечь номер версии uuid. Есть ли надежный способ извлечения информации, такой как метка времени, MAC-адрес?
Да и Да; если UUID - это версия 1 или версия 2 (как описано в RFC 4122). Существует также альтернативная (не RFC 4122) версия 4, получившая название "COMB", которая включает в себя временную метку (а также случайные значения), которая может быть проанализирована, а также дату и время создания.
Бонус: Mahonri Moriancumer UUID и GUID Generator and Forensics.
Вы можете посмотреть версию Uuid, но этому можно доверять только в том случае, если вы уверены, что Uuid действителен (см. http://tools.ietf.org/html/rfc4122). Версия скажет вам, что у вас есть Uuid, и с помощью этого вы можете извлекать определенные биты информации.
OUSP uuid tool может декодировать UUID всех версий. В Linux-системах на базе Debian вы можете использовать apt-get install uuid
для его установки; для других дистрибутивов имя пакета может отличаться.
Чтобы декодировать UUID, используйте флаг -d
(decode):
uuid -d AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF
Для UUID версии 1 это дает MAC-адрес и временную метку - поскольку это то, что в v1 uuid.