¿Qué tan seguro es usar UUID para identificar algo de manera ú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 solo, por pura casualidad. ¿Existe un sistema mejor o un patrón de algún tipo para aliviar este problema?
guid
uniqueidentifier
uuid
Jason
fuente
fuente
Respuestas:
Muy seguro:
Consideración:
Fuente: La sección de probabilidad aleatoria de duplicados de UUID del artículo de Wikipedia sobre identificadores únicos universalmente (el enlace lleva a una revisión de diciembre de 2016 antes de editar la sección reelaborada).
También vea la sección actual sobre el mismo tema en el mismo artículo de identificador único universal, Collisions .
fuente
Si por "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.
fuente
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 es el UUID basado en el tiempo más la dirección MAC. 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 en 3603 AD para que estos UUID estén seguros al menos hasta entonces (a menos que necesite más de 10 millones de nuevos UUID por segundo o alguien clone su tarjeta de red). Digo "al menos" porque el reloj comienza el 15 de octubre de 1582, por lo que tiene unos 400 años después de que el reloj termina antes de que haya incluso una pequeña posibilidad de duplicaciones.
La versión 4 es el número aleatorio UUID. Hay seis bits fijos y el resto del UUID son 122 bits de aleatoriedad. Consulte Wikipedia u otro análisis que describa lo poco probable que 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 aleatorio o pseudoaleatorio. Entonces, en términos de seguridad, es como si la Versión 4 fuera un problema estadístico (siempre y cuando se asegure de que el algoritmo de resumen está procesando siempre es único).
La versión 2 es similar a la versión 1, pero con un reloj más pequeño, por lo que terminará 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 al dejarlo a las probabilidades (p. Ej., Es el tipo de persona preocupada por la destrucción de la Tierra por un gran asteroide en su vida), solo 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á de 3603 AD).
Entonces, ¿por qué no todos simplemente usan 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 generó y pueden ser predecibles, dos cosas que pueden tener implicaciones de seguridad para la aplicación que usa esos UUID.
fuente
La respuesta a esto puede depender en gran medida de la versión UUID.
Muchos generadores UUID usan un número aleatorio de la versión 4. Sin embargo, muchos de estos usan Pseudo un generador de números aleatorios para generarlos.
Si se usa un PRNG mal sembrado con un período pequeño para generar el UUID, diría que no es muy seguro en absoluto.
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 de la 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 un choque.
En mi caso, el PRNG que estoy usando es un tornado de mersenne y estoy teniendo cuidado con la forma en que se siembra, que proviene de múltiples fuentes, incluido / dev / urandom. El trabalenguas de Mersenne tiene un período de 2 ^ 19937 - 1. Pasará mucho, mucho tiempo antes de que vea un líquido repetido.
fuente
Citando de Wikipedia :
Continúa explicando con bastante buen detalle qué tan seguro es en realidad. Entonces, para responder a su pregunta: Sí, es lo suficientemente seguro.
fuente
Estoy de acuerdo con las otras respuestas. Los UUID son lo suficientemente seguros para casi todos los fines prácticos 1 , y ciertamente para los suyos.
Pero supongamos (hipotéticamente) que no lo son.
Aquí hay un par de enfoques:
Use un UUID más grande. Por ejemplo, en lugar de 128 bits aleatorios, use 256 o 512 o ... Cada bit que agregue a un UUID de estilo tipo 4 reducirá la probabilidad de colisión a la mitad, suponiendo que tenga una fuente confiable de entropía 2 .
Cree un servicio centralizado o distribuido que genere UUID y registre todos y cada uno de los que haya emitido. Cada vez que genera uno nuevo, verifica que el UUID nunca se haya emitido antes. Tal servicio sería técnicamente sencillo de implementar (creo) si asumiéramos que las personas que administran el servicio son absolutamente confiables, incorruptible, etc. Desafortunadamente, no lo son ... especialmente cuando existe la posibilidad de que las organizaciones de seguridad de los gobiernos interfieran. Por lo tanto, este método es probablemente poco práctico, y puede ser 3 imposible en el mundo real.
1 - Si la unicidad de los UUID determinara si los misiles nucleares se lanzaron en la capital de su país, muchos de sus conciudadanos no estarían convencidos por "la probabilidad es extremadamente baja". De ahí mi calificación de "casi todos".
2 - Y aquí hay una pregunta filosófica para ti. ¿Hay algo realmente al azar? ¿Cómo sabríamos si no fuera así? ¿Es el universo como lo conocemos una simulación? ¿Hay un Dios que posiblemente podría "modificar" las leyes de la física para alterar un resultado?
3 - Si alguien conoce algún trabajo de investigación sobre este problema, por favor comente.
fuente
Los esquemas de UUID generalmente usan no solo un elemento pseudoaleatorio, sino también la hora actual del sistema y algún tipo de identificación de hardware a menudo única si está disponible, como una dirección MAC de red.
El punto principal del uso de UUID es que confía en que hará un mejor trabajo al proporcionar una identificación única de lo que usted mismo podría hacer. Esta es la misma razón detrás del uso de una biblioteca de criptografía de terceros en lugar de crear la suya propia. Hacerlo usted mismo puede ser más divertido, pero generalmente es menos responsable hacerlo.
fuente
Lo he estado haciendo por años. Nunca te encuentres con un problema.
Por lo general, configuro mis bases de datos para tener una tabla que contenga todas las claves y las fechas modificadas y demás. Nunca me he encontrado con un problema de duplicar claves.
El único inconveniente que tiene es que cuando está escribiendo algunas consultas para encontrar información rápidamente, está copiando y pegando muchas teclas. Ya no tienes los identificadores cortos y fáciles de recordar.
fuente
Aquí hay un fragmento de prueba para que pueda probar su originalidad. inspirado en el comentario de @ scalabl3
Si se siente afortunado, marque la casilla de verificación, solo verifica la identificación generada actualmente. Si desea una verificación del historial, no la marque. Tenga en cuenta que puede quedarse sin memoria RAM en algún momento si lo deja sin marcar. Traté de hacerlo compatible con la CPU para que pueda abortar rápidamente cuando sea necesario, simplemente presione el botón Ejecutar fragmento nuevamente o salga de la página.
fuente
No sé si esto es importante para usted, pero tenga en cuenta que los GUID son globalmente únicos, pero las subcadenas de GUID no lo son .
fuente
Para UUID4, hago que haya aproximadamente tantas identificaciones como granos de arena en una caja en forma de cubo con lados de 360,000 km de largo. Esa es una caja con lados ~ 2 1/2 veces más largos que el diámetro de Júpiter.
Trabajando para que alguien pueda decirme si he estropeado las unidades:
fuente