Какие данные вы можете извлечь из UUID?

Я знаю, что мы могли бы легко извлечь номер версии uuid. Есть ли надежный способ извлечения информации, такой как метка времени, MAC-адрес?

Спасибо!

Ответы

Ответ 1

Стандартно-совместимый UUID может быть одним из нескольких вариантов, он выглядит так:

AAAAAAAA-BBBB-КЦИК-DDDD-FFFFFFFFFFFF

Первая (шестнадцатеричная) цифра части DDDD определяет вариант.

Если это один из 8,9, A, B соответствует текущей спецификации (0-7 зарезервированы для обратной совместимости, C, D зарезервированы для Microsoft, а E, F зарезервированы для будущего использования)

Если он соответствует текущей спецификации, проверьте первую цифру части CCCC, которая определяет версию UUID:

  • Время с уникальным или случайным идентификатором хоста (MAC)
  • Версия DCE Security (с идентификаторами POSIX)
  • Основанный на имени (хэш MD5)
  • Случайное
  • Основанный на имени (SHA-1 хэш)

Версия 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.

Ответ 2

Не обязательно надежный способ, потому что в зависимости от типа UUID он может генерироваться полностью из случайных битов или основываться на временной шкале или основываться на MAC-адресе. Таким образом, вы можете получить часть этой информации, но вы не можете гарантировать, что можете получить что-нибудь.

Официальная ссылка на это RFC 4122, которая, вероятно, должна предоставить вам достаточно информации для извлечения данных, хотя вы, вероятно, не должны полагаться на это слишком тяжело.

Ответ 3

Если это UUID версии 1, MAC-адрес будет последним двенадцать шестнадцатеричных цифр.

Ответ 4

Я знаю, что мы могли бы легко извлечь номер версии uuid. Есть ли надежный способ извлечения информации, такой как метка времени, MAC-адрес?

Да и Да; если UUID - это версия 1 или версия 2 (как описано в RFC 4122). Существует также альтернативная (не RFC 4122) версия 4, получившая название "COMB", которая включает в себя временную метку (а также случайные значения), которая может быть проанализирована, а также дату и время создания.

Бонус: Mahonri Moriancumer UUID и GUID Generator and Forensics.

Ответ 5

Вы можете посмотреть версию Uuid, но этому можно доверять только в том случае, если вы уверены, что Uuid действителен (см. http://tools.ietf.org/html/rfc4122). Версия скажет вам, что у вас есть Uuid, и с помощью этого вы можете извлекать определенные биты информации.

Ответ 6

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.