¿Qué tan único es el UUID?
¿Qué tan seguro es usar UUID para identificar algo de forma única (lo estoy usando para archivos cargados en el servidor)? Según tengo entendido, se basa en números aleatorios. Sin embargo, me parece que con el tiempo suficiente, eventualmente se repetiría, simplemente por pura casualidad. ¿Existe un sistema mejor o un patrón de algún tipo para aliviar este problema?
Muy seguro:
Se estima que el riesgo anual de que una persona determinada sea golpeada por un meteorito es de una posibilidad entre 17 mil millones, lo que significa que la probabilidad es de aproximadamente 0,00000000006 (6 × 10 −11 ), equivalente a las probabilidades de crear unas pocas decenas de billones de UUID. en un año y tener un duplicado. En otras palabras, sólo después de generar mil millones de UUID por segundo durante los próximos 100 años, la probabilidad de crear un solo duplicado sería aproximadamente del 50%.
Advertencia:
Sin embargo, estas probabilidades solo se mantienen cuando los UUID se generan utilizando suficiente entropía. De lo contrario, la probabilidad de duplicados podría ser significativamente mayor, ya que la dispersión estadística podría ser menor. Cuando se requieren identificadores únicos para aplicaciones distribuidas, de modo que los UUID no entren en conflicto incluso cuando se fusionan datos de muchos dispositivos, la aleatoriedad de las semillas y los generadores utilizados en cada dispositivo debe ser confiable durante la vida útil de la aplicación. Cuando esto no sea factible, RFC4122 recomienda utilizar una variante de espacio de nombres.
Fuente: Sección de probabilidad aleatoria de duplicados de UUID del artículo de Wikipedia sobre Identificadores universalmente únicos (el enlace conduce a una revisión de diciembre de 2016 antes de que la edición reelaborara la sección).
Consulte también la sección actual sobre el mismo tema en el mismo artículo sobre Identificador único universal, Colisiones .
Si por "con el tiempo suficiente" te refieres a 100 años y los estás creando a un ritmo de mil millones por segundo, entonces sí, tienes un 50% de posibilidades de tener una colisión después de 100 años.
Hay más de un tipo de UUID, por lo que "qué tan seguro" depende del tipo (que las especificaciones de UUID llaman "versión") que esté utilizando.
La versión 1 se basa en el tiempo más la dirección MAC UUID. Los 128 bits contienen 48 bits para la dirección MAC de la tarjeta de red (que es asignada exclusivamente por el fabricante) y un reloj de 60 bits con una resolución de 100 nanosegundos. Ese reloj se ajusta a 3603 AD , por lo que estos UUID están seguros al menos hasta entonces (a menos que necesite más de 10 millones de UUID nuevos por segundo o que alguien clone su tarjeta de red). Digo "al menos" porque el reloj comienza el 15 de octubre de 1582, por lo que tienes unos 400 años después de que el reloj termine antes de que exista incluso una pequeña posibilidad de duplicaciones.
La versión 4 es el UUID de número aleatorio. Hay seis bits fijos y el resto del UUID es de 122 bits de aleatoriedad. Consulte Wikipedia u otros análisis que describan cuán improbable es un duplicado.
La versión 3 usa MD5 y la versión 5 usa SHA-1 para crear esos 122 bits, en lugar de un generador de números aleatorios o pseudoaleatorios. Entonces, en términos de seguridad, es como si la Versión 4 fuera un problema estadístico (siempre que se asegure de que lo que procesa el algoritmo de resumen sea siempre único).
La versión 2 es similar a la versión 1, pero con un reloj más pequeño, por lo que finalizará mucho antes. Pero dado que los UUID de la versión 2 son para DCE, no debería usarlos.
Entonces, para todos los problemas prácticos, son seguros. Si no se siente cómodo con dejarlo en manos de las probabilidades (por ejemplo, usted es el tipo de persona preocupada porque la Tierra sea destruida por un gran asteroide durante su vida), simplemente asegúrese de usar un UUID de la versión 1 y se garantiza que será único ( en su vida, a menos que planee vivir más allá del 3603 d.C.).
Entonces, ¿por qué no todo el mundo simplemente utiliza los UUID de la versión 1? Esto se debe a que los UUID de la versión 1 revelan la dirección MAC de la máquina en la que se generaron y pueden ser predecibles, dos cosas que podrían tener implicaciones de seguridad para la aplicación que utiliza esos UUID.
La respuesta a esto puede depender en gran medida de la versión del UUID.
Muchos generadores de UUID utilizan un número aleatorio de la versión 4. Sin embargo, muchos de ellos utilizan un generador de números pseudoaleatorios (PRNG) para generarlos.
Si se utiliza un PRNG mal sembrado con un período pequeño para generar el UUID, diría que no es nada seguro. Algunos generadores de números aleatorios también tienen una varianza pobre. es decir, favorecer ciertos números más a menudo que otros. Esto no va a funcionar bien.
Por lo tanto, es tan seguro como los algoritmos utilizados para generarlo.
Por otro lado, si conoce la respuesta a estas preguntas, creo que un UUID versión 4 debería ser muy seguro de usar. De hecho, lo estoy usando para identificar bloques en un sistema de archivos de bloques de red y hasta ahora no he tenido ningún conflicto.
En mi caso, el PRNG que estoy usando es un Mersenne Twister y estoy teniendo cuidado con la forma en que se siembra, que proviene de múltiples fuentes, incluido /dev/urandom. Mersenne Twister tiene un período de 2^19937 − 1. Pasará mucho tiempo antes de que vea un UUID repetido.
Así que elija una buena biblioteca o generela usted mismo y asegúrese de utilizar un algoritmo PRNG decente.