¿Cuán seguros son indestructibles los GUID?

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

Estos eran boletos para comprar propiedades en el Medio Oriente, y cada boleto tenía un valor potencial de alrededor de $ 3,000,000. Claramente repartir enteros secuenciales habría sido una mala idea. Usamos GUID ya que son básicamente indescifrables, pero mi pregunta es: ¿están lo suficientemente seguros?

Según tengo entendido, los GUID .NET producidos son totalmente pseudoaleatorios (excepto por algunos bits no variables). Sin embargo, no sé qué algoritmo se usa para generarlos.

La documentación de MSDN nos dice que Random es rápido e inseguro, y que RNGCryptoServiceProvider es lento y seguro. Es decir, es razonable suponer que alguien podría esforzarse lo suficiente para predecir el resultado de Random , pero no de RNGCryptoServiceProvider .

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

[En nuestro caso particular hubo comprobaciones de seguridad física más tarde – usted tenía que presentar el pasaporte que utilizó para comprar su boleto – por lo que no habría sido tan malo si alguien hubiera adivinado el GUID de otra persona, así que no lo sudamos en el 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 es suficiente”.

Usando la respuesta de 0xA3 a continuación, y siguiendo los enlaces de la pregunta a la que se vinculó, el siguiente código generará un GUID criptográficamente aleatorio que es válido según la Secció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 GUIDs mucho más lentamente que Guid.NewGuid() , pero con 122 bits de datos “muy aleatorios”, son impredecibles de forma segura.

Por supuesto, cualquier texto criptográficamente aleatorio habría hecho para un número de ticket, pero los GUID son bastante útiles. 🙂

Al igual que con otros GUID de la versión 4, no existe una garantía absoluta de exclusividad, 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 de 99% seguro de que no hay colisiones. Dicho de otra manera: si, como la mía, tu aplicación tendrá errores de desbordamiento por todo el lugar si tienes más de int.MaxValue de prácticamente cualquier cosa, puedes tener más de 99.9999999999999999% de seguridad de que no haya colisiones (es decir, e ^ – (((2 ^ 31-1) ^ 2) / (2 * 2 ^ 122)) ). Esto es casi mil veces más seguro de lo que puede ser que un meteor no borre la mayor parte de la vida en la Tierra en un segundo de la aplicación en funcionamiento (es decir, uno cada 100 millones de años ).

Los UUID / GUID están especificados por RFC4122 . Aunque los UUID de la Versión 4 se crean a partir de números aleatorios, la Sección 6 hace una statement explícita sobre la seguridad:

No suponga que los UUID son difíciles de adivinar ; no deben usarse como capacidades de seguridad (identificadores cuya mera posesión concede acceso), por ejemplo. Una fuente de números aleatorios predecibles exacerbará la situación.

También se puede encontrar una buena discusión sobre la aleatoriedad de los GUID en esta pregunta:

¿Cómo Random es System.Guid.NewGuid ()? (Toma dos)

Este es un ejemplo perfecto de cómo no pensar en un problema de seguridad. Desafortunadamente, es la forma en que la mayoría de los desarrolladores piensan en la seguridad …

… potencialmente vale alrededor de $ 3,000,000 … ¿están lo suficientemente seguros? …

No. Se pueden aplicar muchos recursos a un problema que tiene un posible pago de $ 3 millones por boleto . Ese tipo de dinero podría atraer a personas con muchos recursos … algunas personas muy serias. Usar cualquier cosa que dependa de un generador de números aleatorios de propósito general no es muy aleatorio … por lo tanto, no es muy seguro. Es más ofuscación que la criptografía.

… controles de seguridad física … tenía que presentar el pasaporte utilizado …

De nuevo, con esa cantidad de cheddar en la línea … Puedo conseguirle el pasaporte que desee.

… posible predecir futuros? …

Sí. La pregunta es … ¿Cuánto tiempo tomaría? … por alguna unidad de trabajo de procesamiento.

… Si es así, ¿cuántos necesitarías ver? …

Eso depende de lo que sé sobre su creación … SO, CPU, etc. … y estoy seguro de que puedo encontrar a alguien en su empresa que esté interesado en proporcionar cierta información a cambio de, digamos, … $ 100,000 o, más probable, menos.

– Todo esto puede parecer un poco demasiado dramático, pero estás hablando de una gran cantidad de dinero y debería estar protegido con una gran cantidad de seguridad. Necesita una firma de consultoría de seguridad que pueda ayudarlo a elegir el paquete de cifrado que compre para esto. Su cliente debería poder ayudar a través de su departamento de gestión de riesgos o su aseguradora … De lo contrario, obtenga su propio abogado … el que ya debería tener .

Por supuesto, hay muy pocas posibilidades de que algo salga mal con el esquema GUID, pero si funcionara en forma de pera … ¿Cómo les dirá a todos esos abogados que su plan de seguridad era de primera clase y que deberían buscar en otro lado? Confía en mí, no quieres sostener la bolsa si algo sale mal. Eso realmente apestaría por ti.

Editar: sobre el comentario de teedyay …

Siempre es una buena idea obtener una tarjeta de “Salir de la cárcel libre” del cliente. Si les dices: “Podemos hacer que sea seguro en el caso de ataques triviales … pero no somos una empresa de seguridad o criptografía”. entonces su trabajo está hecho y el cliente se queda con la bolsa .

GUID s son generados por un algoritmo muy conocido. No hay ninguna aleatoriedad incorporada, ya que los valores conocidos, como las identificaciones de tarjetas de red y las marcas de tiempo, se utilizan para generarlos.

Nunca deben usarse como un medio de seguridad.

EDITAR

Parece que la versión más reciente del algoritmo GUID/UUID ya no usa la dirección de hardware para partes de sus valores y en su lugar usa números pseudoaleatorios. Pero estos no son realmente aleatorios y aún no deberían usarse para aplicaciones críticas de seguridad.