with services example encrypt cryptographic .net cryptography guid

.net - services - rsacryptoserviceprovider



¿Cuán seguros son los GUID? (3)

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 del boleto.

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

Como lo entiendo, los GUID .NET producidos son totalmente pseudoaleatorios (excepto por unos pocos bits que no varían). Sin embargo, no sé qué algoritmo se utiliza para generarlos.

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

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

[En nuestro caso en particular, hubo controles físicos de seguridad más adelante (tuvo que presentar el pasaporte que usó para comprar su boleto), por lo que no habría sido tan malo si alguien hubiera adivinado el GUID de otra persona, por lo que no lo dudamos. 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:

Así que la respuesta es "no es suficiente".

Usando la respuesta de 0xA3 continuación, y siguiendo los enlaces de la question 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 GUID mucho más lentamente que Guid.NewGuid() , pero con 122 bits de datos "muy aleatorios", son impredecibles con seguridad.

Por supuesto, cualquier texto criptográfico aleatorio se habría hecho para un número de boleto, pero los GUID son bastante útiles. :-)

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


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

... potencialmente vale alrededor de $ 3,000,000 ... ¿son lo suficientemente seguros? ...

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

... los controles de seguridad física ... debían presentar el pasaporte utilizado ...

Nuevamente, con esa cantidad de queso cheddar en la línea ... puedo conseguirle el pasaporte que quiera.

... posible predecir los 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 sepa sobre su creación ... SO, CPU, etc ... y estoy seguro de que puedo encontrar a alguien en su empresa que esté interesado en proporcionar alguna información a cambio de ... $ 100,000 o, más probable, menos.

- Todo esto puede parecer un poco demasiado dramático, pero está hablando de una gran cantidad de dinero y debe protegerse con una gran seguridad. Necesita una empresa de consultoría de seguridad que pueda ayudarlo a elegir el paquete de cifrado que compre para esto. Su cliente debe poder ayudarlo a través de su departamento de administración de riesgos o su aseguradora ... Si no es así, 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 fuera todo en forma de pera ... ¿Cómo le dirá a todos esos abogados que su plan de seguridad fue de primera clase y que deberían buscar en otra parte? ... Confía en mí, no quieres estar sosteniendo la bolsa si algo sale mal. Eso realmente apestaría por ti.

Edición: Sobre el comentario de teedyay ...

Obtener una tarjeta de "Salir de la cárcel gratis" del cliente siempre es una buena idea. Si les dice "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 .


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 declaración explícita sobre seguridad:

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

En esta pregunta también se puede encontrar una buena discusión de la aleatoriedad de los GUID:

question question


GUID son generados por un algorithm muy conocido. No hay aleatoriedad incorporada, se utilizan valores tan conocidos como las ID de tarjetas de red y las marcas de tiempo para generarlas.

Nunca deben ser utilizados 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 deben usarse para aplicaciones de seguridad críticas.