Pregunta

¿Es seguro usar UUID para identificar algo (lo estoy usando para los archivos subidos al servidor)?Como yo lo entiendo, se basa en los números al azar.Sin embargo, a mí me parece que dado el tiempo suficiente, que finalmente se repita a sí misma, sólo por pura casualidad.Hay un sistema mejor o un patrón de algún tipo para aliviar este problema?

¿Fue útil?

Solución

Muy seguro:

  

el riesgo anual de una persona dada de ser golpeado por un meteorito se   estima que es una posibilidad entre 17 mil millones, lo que significa la   probabilidad es de aproximadamente 0,00000000006 (6 × 10 -11 ), equivalente a las probabilidades   la creación de unas pocas decenas de billones de UUID en un año y tener uno   duplicar. En otras palabras, sólo después de la generación de 1 mil millones de UUID cada   segundo para los próximos 100 años, la probabilidad de crear una sola   duplicar sería de alrededor de 50%.

Advertencia:

  

Sin embargo, estas probabilidades sólo tienen cuando se generan los UUID   usando suficiente entropía. De lo contrario, la probabilidad de duplicados   podría ser significativamente más elevada, ya que la dispersión estadística podría   ser menor. Donde identificadores únicos son necesarios para distribuida   aplicaciones, de modo que los UUID no entrar en conflicto, incluso cuando los datos de muchos   dispositivos se fusionaron, la aleatoriedad de las semillas y generadores usado en   cada dispositivo debe ser confiable para la vida de la aplicación. Dónde   esto no es factible, RFC4122 recomienda el uso de una variante de espacio de nombres   en su lugar.

Fuente: El UUID probabilidad aleatoria de duplicados sección del artículo de Wikipedia sobre identificadores únicos universales (enlace lleva a una revisión a partir de diciembre el año 2016 antes de la edición volvió a trabajar el apartado).

También vea la sección actual sobre el mismo tema en el mismo artículo identificador único universal, Las colisiones .

Otros consejos

Si por "dado el tiempo suficiente" quiere decir 100 años y que está creando a un ritmo de un mil millones de un segundo, entonces sí, usted tiene una probabilidad del 50% 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 de qué tipo (que las especificaciones UUID llaman "versión") que está utilizando.

  • Version 1 es el tiempo base, más la dirección UUID MAC. El 128 bits contiene 48 bits para la dirección MAC de la tarjeta de red (que se asignan de forma exclusiva por el fabricante) y un reloj de 60 bits con una resolución de 100 nanosegundos. Ese reloj envuelve en 3603 AD para estos UUID son seguros al menos hasta entonces (a menos que necesite más de 10 millones de nuevos UUID por segundo o alguien clones de su tarjeta de red). Digo "al menos", porque el reloj se pone a 15 de octubre de 1582, por lo que tiene alrededor de 400 años después de que el reloj se ajusta antes incluso hay una pequeña posibilidad de duplicaciones.

  • Versión 4 es el UUID de números aleatorios. Hay seis bits fijos y el resto de la UUID es de 122 bits de aleatoriedad. Ver Wikipedia u otro análisis que describen cómo muy poco probable que un duplicado es.

  • Version 3 es utiliza MD5 y la Versión 5 utiliza SHA-1 para crear esos 122 bits, en lugar de un generador de números aleatorios o pseudo-aleatoria. Así que en términos de seguridad es como la versión 4 que es una cuestión estadística (siempre y cuando se asegure de lo que el algoritmo de resumen de procesamiento es siempre es única).

  • La versión 2 es similar a la Versión 1, pero con un reloj más pequeño por lo que se va a envolver alrededor de mucho antes. Sin embargo, desde la versión 2 se UUID de DCE, que no debe ser el uso de estos.

Así que para todos los problemas prácticos que son seguros. Si se siente incómodo con dejar en manos de probabilidades (por ejemplo, su son el tipo de persona preocupada por la tierra ser destruido por un gran asteroide en su vida), sólo asegúrese de que utiliza un UUID versión 1 y se garantiza que sea único ( en su vida, a menos que pretenda vivir más allá de 3603 dC).

Entonces, ¿por qué no todos sólo tiene que utilizar la versión 1 UUID? Esto se debe a la Versión 1 UUID revelan la dirección MAC de la máquina en que se generó en y que puede ser predecible -. Dos cosas que podrían tener implicaciones de seguridad para la aplicación usando los UUID

La respuesta a esto puede depender en gran medida de la versión UUID.

Muchos generadores UUID utilizan un número aleatorio versión 4. Sin embargo, muchos de éstos utilizan Pseudo Generador de números aleatorios para generarlos.

Si un PRNG mal sembrado con un pequeño periodo se utiliza para generar el UUID yo diría que no es muy seguro en absoluto.

Por lo tanto, es sólo tan seguro como los algoritmos utilizados para generarla.

Por otro lado, si usted sabe la respuesta a estas preguntas, entonces creo que un UUID la versión 4 debe estar muy seguro de usar. De hecho lo estoy usando para identificar bloques de un sistema de archivos de bloque 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 sembró, que es a partir de múltiples fuentes, incluyendo / dev / urandom. Mersenne Twister tiene un período de 2 ^ 19937 -. 1. Va a ser un muy largo tiempo antes de ver a un UUID de repetición

Wikipedia :

  

Por lo tanto, cualquier persona puede crear un UUID y el uso   a identificar algo con   la confianza razonable de que el   identificador nunca será   involuntariamente utilizado por cualquier persona para   cualquier otra cosa

Se va a explicar en detalle bastante bueno en lo seguro que es en realidad. Así que para responder a su pregunta:. Sí, es lo suficientemente seguro

UUID de los esquemas generalmente utilizan no sólo un pseudo-elemento aleatorio, sino también la hora actual del sistema, y algún tipo de menudo-IDENTIFICADOR único de hardware si están disponibles, tales como una dirección MAC de red.

El punto de usar UUID es que se confía en él para hacer un mejor trabajo de proporcionar un IDENTIFICADOR único que usted sería capaz de hacer.Este es el mismo razonamiento detrás de usar un 3er partido biblioteca de criptografía en lugar de rodar su propio.Hacerlo usted mismo puede ser más divertido, pero suele ser menos responsables para hacerlo.

estado haciendo durante años. Nunca se quede en un problema.

Por lo general establecido de mi base de datos para tener una tabla que contiene todas las claves y las fechas de modificación y tal. No se han topado con un problema de duplicados de las llaves de la historia.

El único inconveniente que tiene es cuando se escribe algunas consultas de encontrar alguna información rápida que está haciendo un montón de copiar y pegar de las llaves. No es necesario que el corto fácil de recordar las identificaciones más.

He aquí un fragmento de pruebas para poner a prueba su uniquenes. inspirado por el comentario de @ scalabl3

  

Lo curioso es que, podría generar 2 en una fila que eran idénticos, por supuesto, a niveles alucinantes de coincidencia, la suerte y la intervención divina, sin embargo, a pesar de las probabilidades insondables, todavía es posible! : D Sí, no va a suceder. sólo decir para la diversión de pensar en ese momento cuando creó un duplicado! de vídeo captura de pantalla! - scalabl3 20 Oct '15 a las 19:11

Si te sientes con suerte, marque la casilla de verificación, sólo comprueba los generados actualmente de identificación. Si desea una verificación de antecedentes, deje sin marcar. Tenga en cuenta, es posible que se quede sin memoria RAM en algún momento si lo deja sin seleccionar. Traté de hacerlo con tu CPU para que pueda abortar rápidamente cuando sea necesario, simplemente pulse el botón de ejecución fragmento de nuevo o salir de la página.

Math.log2 = Math.log2 || function(n){ return Math.log(n) / Math.log(2); }
  Math.trueRandom = (function() {
  var crypt = window.crypto || window.msCrypto;

  if (crypt && crypt.getRandomValues) {
      // if we have a crypto library, use it
      var random = function(min, max) {
          var rval = 0;
          var range = max - min;
          if (range < 2) {
              return min;
          }

          var bits_needed = Math.ceil(Math.log2(range));
          if (bits_needed > 53) {
            throw new Exception("We cannot generate numbers larger than 53 bits.");
          }
          var bytes_needed = Math.ceil(bits_needed / 8);
          var mask = Math.pow(2, bits_needed) - 1;
          // 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111

          // Create byte array and fill with N random numbers
          var byteArray = new Uint8Array(bytes_needed);
          crypt.getRandomValues(byteArray);

          var p = (bytes_needed - 1) * 8;
          for(var i = 0; i < bytes_needed; i++ ) {
              rval += byteArray[i] * Math.pow(2, p);
              p -= 8;
          }

          // Use & to apply the mask and reduce the number of recursive lookups
          rval = rval & mask;

          if (rval >= range) {
              // Integer out of acceptable range
              return random(min, max);
          }
          // Return an integer that falls within the range
          return min + rval;
      }
      return function() {
          var r = random(0, 1000000000) / 1000000000;
          return r;
      };
  } else {
      // From http://baagoe.com/en/RandomMusings/javascript/
      // Johannes Baagøe <baagoe@baagoe.com>, 2010
      function Mash() {
          var n = 0xefc8249d;

          var mash = function(data) {
              data = data.toString();
              for (var i = 0; i < data.length; i++) {
                  n += data.charCodeAt(i);
                  var h = 0.02519603282416938 * n;
                  n = h >>> 0;
                  h -= n;
                  h *= n;
                  n = h >>> 0;
                  h -= n;
                  n += h * 0x100000000; // 2^32
              }
              return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
          };

          mash.version = 'Mash 0.9';
          return mash;
      }

      // From http://baagoe.com/en/RandomMusings/javascript/
      function Alea() {
          return (function(args) {
              // Johannes Baagøe <baagoe@baagoe.com>, 2010
              var s0 = 0;
              var s1 = 0;
              var s2 = 0;
              var c = 1;

              if (args.length == 0) {
                  args = [+new Date()];
              }
              var mash = Mash();
              s0 = mash(' ');
              s1 = mash(' ');
              s2 = mash(' ');

              for (var i = 0; i < args.length; i++) {
                  s0 -= mash(args[i]);
                  if (s0 < 0) {
                      s0 += 1;
                  }
                  s1 -= mash(args[i]);
                  if (s1 < 0) {
                      s1 += 1;
                  }
                  s2 -= mash(args[i]);
                  if (s2 < 0) {
                      s2 += 1;
                  }
              }
              mash = null;

              var random = function() {
                  var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
                  s0 = s1;
                  s1 = s2;
                  return s2 = t - (c = t | 0);
              };
              random.uint32 = function() {
                  return random() * 0x100000000; // 2^32
              };
              random.fract53 = function() {
                  return random() +
                      (random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
              };
              random.version = 'Alea 0.9';
              random.args = args;
              return random;

          }(Array.prototype.slice.call(arguments)));
      };
      return Alea();
  }
}());

Math.guid = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c)    {
      var r = Math.trueRandom() * 16 | 0,
          v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
  });
};
function logit(item1, item2) {
    console.log("Do "+item1+" and "+item2+" equal? "+(item1 == item2 ? "OMG! take a screenshot and you'll be epic on the world of cryptography, buy a lottery ticket now!":"No they do not. shame. no fame")+ ", runs: "+window.numberofRuns);
}
numberofRuns = 0;
function test() {
   window.numberofRuns++;
   var x = Math.guid();
   var y = Math.guid();
   var test = x == y || historyTest(x,y);

   logit(x,y);
   return test;

}
historyArr = [];
historyCount = 0;
function historyTest(item1, item2) {
    if(window.luckyDog) {
       return false;
    }
    for(var i = historyCount; i > -1; i--) {
        logit(item1,window.historyArr[i]);
        if(item1 == history[i]) {
            
            return true;
        }
        logit(item2,window.historyArr[i]);
        if(item2 == history[i]) {
            
            return true;
        }

    }
    window.historyArr.push(item1);
    window.historyArr.push(item2);
    window.historyCount+=2;
    return false;
}
luckyDog = false;
document.body.onload = function() {
document.getElementById('runit').onclick  = function() {
window.luckyDog = document.getElementById('lucky').checked;
var val = document.getElementById('input').value
if(val.trim() == '0') {
    var intervaltimer = window.setInterval(function() {
         var test = window.test();
         if(test) {
            window.clearInterval(intervaltimer);
         }
    },0);
}
else {
   var num = parseInt(val);
   if(num > 0) {
        var intervaltimer = window.setInterval(function() {
         var test = window.test();
         num--;
         if(num < 0 || test) {
    
         window.clearInterval(intervaltimer);
         }
    },0);
   }
}
};
};
Please input how often the calulation should run. set to 0 for forever. Check the checkbox if you feel lucky.<BR/>
<input type="text" value="0" id="input"><input type="checkbox" id="lucky"><button id="runit">Run</button><BR/>

Estoy de acuerdo con las otras respuestas. UUID son lo suficientemente seguros para los propósitos prácticos casi todos 1 , y ciertamente para los suyos.

Pero supongamos (hipotéticamente) que no lo son.

  

¿Hay un mejor sistema o un patrón de algún tipo para aliviar este problema?

Aquí hay un par de enfoques:

  1. Utilice un UUID más grande. Por ejemplo, en lugar de a 128 bits aleatorios, utilice 256 o 512 o ... Cada bit se agrega a un UUID estilo de tipo 4 se reducirá la probabilidad de una colisión por medio, asumiendo que tiene una fuente confiable de entropía < sup> 2 .

  2. Construir un servicio centralizado o distribuido que genera UUID y registra todas y cada una se ha emitido nunca. Cada vez que se genera uno nuevo, se comprueba que el UUID nunca ha sido emitido antes. Dicho servicio sería técnicamente recta hacia adelante para poner en práctica (creo) si asumimos que las personas que dirigen el servicio eran absolutamente confiable, incorruptible, etcétera. Por desgracia, no son ... sobre todo cuando existe la posibilidad de que 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 singularidad de UUID determina si los misiles nucleares consiguieron lanzadas en la capital de su país, muchos de sus conciudadanos no sería convencido por "la probabilidad es muy baja". De ahí mi "casi todos" calificación.

2 - Y he aquí una pregunta filosófica para usted. Es algo alguna vez verdaderamente aleatoria? ¿Cómo podemos saber si no lo era? Es el universo tal como lo conocemos una simulación? ¿Hay un Dios que posiblemente podría "ajustar" las leyes de la física para alterar un resultado?

3 -. Si alguien sabe de alguna trabajos de investigación sobre este problema, por favor, comentario

No sé si esto es importante para usted, pero tenga en cuenta que GUID son única a nivel mundial, pero subcadenas de GUID no se .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top