Pregunta

Ayer pregunté ¿Son GUID? generado en Windows 2003 seguro para usar como ID de sesión? y la respuesta combinada con este artículo Los GUID son globalmente únicos, pero las subcadenas de GUID no lo son me llevaron a pensar en reemplazar mi mecanismo actual de usar GUID como ID de sesión en las cookies.

Debido a que es un poco difícil realizar ese cambio, decidí ejecutar una prueba rápida de GUID en mi PC con Vista para ver si una secuencia de GUID era obviamente determinista (lo que me preocupa es si un atacante pudo obtener una secuencia de GUID generados por mi servidor podrían generar nuevos coincidentes).

En el artículo de Raymond Chen (que hace referencia a esta muy antigua especificación UUID y GUID de 1998) el GUID está compuesto por:

  • 60 bits de marca de tiempo,
  • 48 bits de identificador de computadora,
  • 14 bits de uniquifier y
  • seis bits son fijos

En consecuencia, si genero 10 GUID, los primeros 15 caracteres ASCII (excluyendo '-') son la marca de tiempo, los siguientes 12 caracteres ASCII son el identificador de la computadora, los siguientes 3.5 caracteres ASCII son aleatorios y los últimos 1.5 caracteres son fijos .

Obtener 10 GUID en mi PC con Vista usando .Net System.Guid.NewGuid () produce:

b4e95ead-3619-4dc2-9102-cf7ab0efd927
a45ee719-decd-46b2-8355-7becbe406f74
9af68d75-35a0-4907-b6ab-f15e33acfe96
bed88fa3-3209-4a19-97dd-85d5428ea5f4
123cb39b-8d81-41c6-8894-f1257a8f7606
e2b1f6b1-5791-4a18-80a9-5dc668574ecb
c52aa660-2629-4659-bb83-5583081e5a1c
76eda32d-ceda-412e-8ade-30c47416e954
cbc4d45e-7281-40d2-9f90-00539b04fe98
be36524c-267c-4791-bc9e-3c20b29d7615

El único patrón discernible de una inspección visual rápida es que el decimotercer carácter ASCII siempre es 4.

Nuevamente me pregunto si confiar en System.Guid para generar ID de sesión pseudoaleatoria es lo suficientemente fuerte como para proteger una aplicación web en la que descifrar una ID de sesión valdría la mayor parte de miles de dólares.

Actualización: en lugar de usar un GUID, ahora planeo generar mis ID de sesión usando el siguiente enfoque. Estoy convirtiendo el número aleatorio de 384 bits en una cadena de 0x00 bytes para que sea adecuado para su uso en una cookie HTTP.

RNGCryptoServiceProvider rngProvider = new RNGCryptoServiceProvider();
byte[] myKey = new byte[48];
rngProvider.GetBytes(myKey);
string sessionID = null;
myKey.ToList().ForEach(b => sessionID += b.ToString("x2"));
Console.WriteLine(sessionID);
¿Fue útil?

Solución

No es una respuesta completa, pero puedo decirle que el decimotercer dígito hexadecimal siempre es 4 porque denota la versión del algoritmo utilizado para generar el GUID (id est, v4); también, y cito Wikipedia:

  

Criptoanálisis del GUID WinAPI   generador muestra que, desde el   La secuencia de los GUID V4 es pseudoaleatoria,   dado el estado inicial uno puede   predecir hasta los próximos 250 000 GUID   devuelto por la función UuidCreate.   Es por eso que los GUID no deben usarse   en criptografía, por ejemplo, como claves aleatorias.

El resto del artículo y sus referencias: http://en.wikipedia.org/wiki/ Guid

--Editar--

Desde el punto de vista de la seguridad, le sugiero que genere su ID de sesión como lo desee, y luego lo firme criptográficamente; de esa manera, puede empaquetar la información que desee y luego simplemente colocar una firma al final, el posible problema es la compensación entre el tamaño / fortaleza de su clave y el tamaño resultante de la cookie. Los GUID son útiles como ID, pero solo confiaría en una técnica criptográfica dedicada para la seguridad.

Otros consejos

Le sugiero que utilice el System.Security.Cryptography.RandomNumberGenerator . Esto está diseñado para producir números que no se pueden realizar ingeniería inversa. La motivación de Guid es ser único. Podría combinar tanto el GUID como el número aleatorio seguro, pero un número aleatorio seguro de 128 bits nunca tendrá una colisión en la práctica.

Algunas notas:

  1. Dudo que cualquier implementación de GUID haya sido diseñada para ser criptográficamente segura. (Y esta suposición se vería confirmada por el artículo vinculado al siguiente elemento).
  2. El decimotercer carácter ASCII es un significante de qué algoritmo se utilizó para generar el GUID .

Si realmente le preocupa tener identificaciones de sesión sólidas, quizás su mejor enfoque sea un hash criptográficamente seguro de algo que no se puede determinar desde fuera de la máquina. Quizás generar un bloc de una sola vez desde algún documento interno o fuente de datos podría funcionar.

¿Qué intentas hacer? ¿Quieres solo una fuente de números aleatorios?

Consulte random.org y hotbits . Hace muchos años, tenía una biblioteca Java que reunía números de estas fuentes y los unía para obtener una serie aleatoria bastante hermosa (aunque se supone que los dos sitios no están en cahootz).

La respuesta corta es que ningún guid no es lo suficientemente fuerte como para generar identificadores de sesión si desea evitar que las identificaciones de sesión se adivinen y se agrieten.

Por el mismo motivo por el que no desea utilizar un GUID como clave AES, no desea utilizarlos para ningún tipo de identificaciones confidenciales.

Un GUID funciona extremadamente bien para lo que está diseñado para ser: una identificación única garantizada matemáticamente para que nunca se repita.

Incluso si descifrar una ID de sesión solo vale $ 1000, imagínese si eso se hace 100 veces. Ahora estás hablando de bling serio.

Sé que es una manera fácil de usar GUID, pero resiste y lidia con el dolor tomando las precauciones adecuadas para asegurar adecuadamente tu aplicación. Tus usuarios te lo agradecerán.

Es casi imposible obtener una guía duplicada teniendo en cuenta las posibilidades de obtener una. Aquí hay algunos datos matemáticos rápidos

Granos de arena en el mundo 75,000,000,000,000,000,000

Número de GUID 340,282,366,920,938,463,463,374,607,431,770,000,000

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