¿Cuán seguros son los GUID?

Hace un tiempo trabajé en una aplicación web donde los usuarios podían comprar boletos. Debido a la forma en que funcionaban los procesos de nuestro cliente, lo que efectivamente obtuvo como resultado de su compra fue una URL con el número de ticket.

Estos fueron boletos para comprar propiedades en el Medio Oriente, y cada boleto potencialmente valía alrededor de $ 3,000,000. Claramente, distribuir enteros secuenciales habría sido una mala idea. Utilizamos GUID ya que son básicamente incuestionables, pero mi pregunta es: ¿son lo suficientemente seguros?

Según tengo entendido, los GUID que produce .NET son totalmente pseudoaleatorios (a excepción de algunos bits que no varían). Sin embargo, no sé qué algoritmo se usa para generarlos.

La documentación de MSDN nos dice queRandom es rápido e inseguro, yRNGCryptoServiceProvider Es lento y seguro. Es decir, es razonable suponer que alguien podría hacer un esfuerzo suficiente para predecir el resultado deRandom, pero no deRNGCryptoServiceProvider.

Si viera una secuencia suficientemente larga de GUID, ¿sería posible predecir los futuros? Si es así, ¿cuántos necesitarías ver?

[En nuestro caso particular, hubo controles de seguridad físicos más tarde, tuvo que presentar el pasaporte que usó para comprar su boleto, por lo que no habría sidotambién malo si alguien hubiera adivinado el GUID de otra persona, por lo que no lo sudamos en ese momento. La conveniencia de usar el GUID como clave de base de datos lo convirtió en un tipo de datos útil para usar.]

Editar:

Entonces la respuesta es "no suficiente".

Utilizando0xA3La respuesta a continuación, y siguiendo los enlaces de lapregunta se vinculó a él, el siguiente código generará un GUID criptográficamente aleatorio que es válido porSección 4.4 de RFC 4122:

static Guid MakeCryptoGuid()
{
    // Get 16 cryptographically random bytes
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] data = new byte[16];
    rng.GetBytes(data);

    // Mark it as a version 4 GUID
    data[7] = (byte)((data[7] | (byte)0x40) & (byte)0x4f);
    data[8] = (byte)((data[8] | (byte)0x80) & (byte)0xbf);

    return new Guid(data);
}

Esto produce GUID mucho más lentamente queGuid.NewGuid(), pero con 122 bits de datos "muy aleatorios", son con seguridad impredecibles.

Por supuesto, cualquier texto criptográficamente aleatorio hubiera sido para un número de ticket, pero los GUID son bastante útiles. :-)

Al igual que con otros GUID de la versión 4, no hay una garantía absoluta de unicidad, pero las probabilidades son impresionantes. Siempre que tenga menos de 326,915,130,069,135,865 (es decir,sqrt (-2 * 2 ^ 122 * ln (0.99))) GUID en juego simultáneamente, puede estar más del 99% seguro de que no hay colisiones. Dicho de otra manera: si como la mía, su aplicación tendrá errores de desbordamiento en todo el lugar si tiene más deint.MaxValue de casi cualquier cosa, puede estar más de 99.999999999999999999% seguro de que no hay colisiones (es decir,e ^ - (((2 ^ 31-1) ^ 2) / (2 * 2 ^ 122))) Esto es aproximadamente mil veces más seguro de lo que puede estar seguro de que un meteorito no eliminará la mayor parte de la vida en la Tierra dentro de un segundo de la aplicación en funcionamiento (es decir,uno por cada 100 millones de años)

Respuestas a la pregunta(3)

Su respuesta a la pregunta