Sé que podríamos extraer fácilmente el número de versión de uuid. ¿Hay alguna manera confiable de extraer información como la marca de tiempo, la dirección MAC?¿Qué tipo de datos puede extraer de un UUID?
Gracias!
Sé que podríamos extraer fácilmente el número de versión de uuid. ¿Hay alguna manera confiable de extraer información como la marca de tiempo, la dirección MAC?¿Qué tipo de datos puede extraer de un UUID?
Gracias!
Puede consultar la versión del Uuid, pero solo se puede confiar si está seguro de que el Uuid es válido (consulte http://tools.ietf.org/html/rfc4122). La versión te dirá qué tipo de Uuid tienes, y al usarlo puedes extraer partes específicas de información.
No necesariamente de una manera confiable, ya que dependiendo del tipo de UUID que es, puede generarse totalmente a partir de bits aleatorios, o estar basado en la marca de tiempo, o basarse en la dirección MAC. Por lo tanto, es posible que pueda obtener parte de esa información, pero no puede garantizar que pueda obtener algo.
La referencia oficial para esto es RFC 4122, que probablemente debería darle suficiente información para extraer datos, aunque probablemente no deba confiar demasiado en ella.
Si es un UUID de versión 1, la dirección MAC serán los últimos doce dígitos hexadecimales.
Pero no hay necesariamente una forma confiable de determinar si un fragmento de bytes con formato UUID arbitrario es en realidad un UUID de versión 1 o simplemente datos aleatorios. En el mejor de los casos, tendrías que tomar la dirección MAC que recibes con un grano de sal. –
@DanielPryden Suponiendo que se sigan los estándares, el número de versión del UUID se incluye en el UUID. Un UUID v1 siempre es xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx. Consulte https://en.wikipedia.org/wiki/Universally_unique_identifier#Format – YeB
@YeB: tiene razón. Pero mi punto es: si ve un trozo de bytes que * parece * como un UUID, no puede estar seguro de que * es * un UUID, y por lo tanto el campo de versión no es necesariamente confiable. Es decir: si intenta extraer datos de los UUID, debe tener en cuenta la posibilidad de que un atacante predetermine los bits que envía, independientemente de lo que indique el estándar. Eso significa, como dije hace más de ocho años: "en el mejor de los casos, tendrías que tomar la dirección MAC que recibes con un grano de sal". –
Un estándar conformes UUID puede ser una de las varias variantes, se ve así:
AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF
El primer dígito (hex) de la parte DDDD determina la variante.
Si es uno de 8,9, A, B es conforme a la especificación actual (0-7 están reservados para compatibilidad con versiones anteriores, C, D están reservados para Microsoft, y E, F están reservados para el futuro uso)
si se ajusta a la especificación actual, comprobar el primer dígito de la parte CCCC que determina la versión UUID:
Versión 4 es simplemente elegido al azar.
Las versiones 3 y 5 se generan al mezclar y descartar algunos bits, lo que significa que básicamente no tiene posibilidad de recuperar ninguna información del mismo. Los detalles sobre cómo construirlo se pueden encontrar en RFC4122 o en el UUID Generator webpage.
No pude encontrar ningún UUID de versión 2, así que no verifiqué cómo extraer los datos.
La versión 1 se genera a partir de una indicación de tiempo y una dirección MAC de host actual. (El estándar también permite utilizar una dirección aleatoria en su lugar si establece el bit "broadcast/multicast" de la dirección MAC.)
La siguiente cortó Perl analiza la dirección MAC y la hora de un UUID versión 1:
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";
};
Y por último pero no menos importante, hay varios UUID asignadas, por ejemplo, para GPT partitions.
Tiene un error en la segunda línea de código. Debería ser: $ uuid = ~ s/- // g; De lo contrario, el script solo reemplazará la primera aparición de '-'. Aparte de eso, gracias por compartir este código. – metator
@metator: La segunda línea probablemente fue la transliteración para eliminar todos los guiones: '-'. El código correcto que funciona en Perl 5.18 es '$ uuid = ~ tr/- // d;' (equivalente al comando de Unix 'tr -d -'). Además, cada línea está sangrada con cuatro espacios, lo que es molesto cuando copias el código. – pabouk
No vi nada en RFC 4412 para sugerir que la explicación de la codificación de la variante es correcta. Solo usó tres bits para determinar la variante, no un hexit completo. – Melab
Sé que podríamos extraer fácilmente el número de versión de uuid. ¿Hay alguna manera confiable de extraer información como la marca de tiempo, la dirección MAC?
Sí y sí; si el UUID es la versión 1 o la versión 2 (como se describe en RFC 4122). También hay una versión 4 (no RFC 4122) alternativa, denominada "COMB" que incluye una marca de tiempo (así como valores aleatorios) que se pueden analizar y se puede revelar la fecha/hora de creación.
Bonificación: UUID and GUID Generator and Forensics de Mahonri Moriancumer.
El OSSP uuid tool puede decodificar UUID de todas las versiones. En sistemas Linux basados en Debian puede usar apt-get install uuid
para instalarlo; para otras distribuciones, el nombre del paquete puede ser diferente.
para decodificar un UUID, utilice el -d
(recepción) de la bandera:
uuid -d AAAAAAAA-BBBB-CCCC-DDDD-FFFFFFFFFFFF
para la versión 1 UUID, esto da la dirección MAC y la marca de tiempo - ya que eso es lo que hay en un UUID v1.
¿Qué sabor de UUID estás preguntando, y qué idioma? Sin esa información, diría que tienes que saber cómo se generó el UUID (versión) para poder saber qué hay disponible para extraer. –