.net - net - ¿Cómo Random es System.Guid.NewGuid()?
system guid newguid c# (8)
Sé que esto puede sonar como una pregunta sin sentido, pero escúchame ...
Básicamente quiero saber si puedo confiar en que el GUID generará un valor que será único el 100% del tiempo e imposible de predecir.
Básicamente estoy iniciando mi sistema de inicio de sesión para un sitio web y quiero saber si el GUID es lo suficientemente seguro para las cookies de sesión.
Cualquier información sobre cómo se genera el GUID sería muy apreciada al evaluar las respuestas.
Gracias por los enlaces para duplicar preguntas, sin embargo, mi pregunta es específica del framework .Net.
Básicamente quiero saber si puedo confiar en que el GUID generará un valor que será único el 100% del tiempo e imposible de predecir .
Básicamente estoy iniciando mi sistema de inicio de sesión para un sitio web y quiero saber si el GUID es lo suficientemente seguro para las cookies de sesión .
Respuesta corta: nada . Es importante tener en cuenta que único y aleatorio son completamente diferentes. Si tuviera un contador universal (como tomar un número en una tienda de delicatessen), esos números son únicos, pero completamente predecibles.
Como señala Bochu arriba, la publicación de Raymond habla de ello: https://blogs.msdn.microsoft.com/oldnewthing/20120523-00/?p=7553/
El algoritmo de generación GUID fue diseñado para ser único. No fue diseñado para la aleatoriedad o la imprevisibilidad. De hecho, si mira una discusión anterior, puede ver que el llamado Algoritmo 1 no es aleatorio y es totalmente predecible. ... Incluso el algoritmo GUID de la Versión 4 (que básicamente dice "establecer la versión en 4 y llenar todo lo demás con números aleatorios o pseudoaleatorios") no se garantiza que sea impredecible, porque el algoritmo no especifica la calidad del azar generador de números
Para números aleatorios seguros, necesita un generador de números aleatorios criptográficamente seguro.
Por cierto, "rodar mi propio sistema de inicio de sesión" es una bandera roja de seguridad; sería negligente si no lo señalara.
La documentación de System.Guid.NewGuid () no garantiza la aleatoriedad, por lo que la implementación actual se basa en un generador de números aleatorios (es la versión 4 del algoritmo, que se diseñó después de que surgieron problemas de privacidad de la versión 1 que usaba el MAC dirección, otros sistemas como el OS X de Apple todavía usan la versión 1 del algoritmo).
Por lo tanto, aunque tiene una probabilidad muy alta de que System.Guid.NewGuid () genere un valor único, no puede hacer suposiciones sobre su predictibilidad porque eso no está especificado en la documentación.
Los GUID son, por definición, únicos en todos los aspectos. Hubo, alguna vez, algunas rutinas de generación de GUID0 que generaban GUID secuenciales, pero esos eran problemas en ... Win98, creo, y fueron corregidos por Microsoft.
Debería poder confiar en que un GUID generado sea único y nunca se repita o regenere.
(EDITAR: Una vez dicho esto, todos entendemos que una cadena de caracteres alfanuméricos tiene un número fijo de permutaciones, si la cadena está fija en longitud. Pero en el caso de un GUID, el número de permutaciones es económico *).
(* Maldición, ¿dónde está ese XKCD donde los números "astronómicos" proponen no son lo suficientemente grandes?)
Ningún valor de longitud fija puede garantizar que sea 100% único (simplemente llámalo suficientes veces, da o quita el universo que termina ;-p), pero puede ser muy, muy, muy poco probable que se duplique.
No puedo hablar de la predictibilidad de los números secuenciales, pero será único. Sin embargo, creo que sería mejor utilizar un generador de números aleatorios de System.Security.Cryptography. Ate un número aleatorio con un valor monotónicamente creciente (tiempo) para generar su clave única y puede estar seguro de que es único y no predecible.
No sé sobre .NET, pero el algoritmo UUID se define con bastante precisión.
editar: si nos fijamos en los bits apropiados (ver entrada de wikipedia), eso debería explicar qué versión de UUID se está utilizando.
edición 2: una bandera roja para su uso de la palabra "seguro", que me dice que es mejor utilizar un método criptográfico bien definido. Por ejemplo, al generar ID de sesión en un servidor, simplemente no haga algo simple como aplicar un hash MD5 a la concatenación de un subconjunto apropiado de los siguientes: {dirección IP de la máquina cliente, contador incrementado secuencialmente, constante secreta fija de su elección, salida del generador de números aleatorios de su elección, etc.}?
Suponiendo que System.Guid.NewGuid usa CoCreateGuid, no es aleatorio en absoluto. Históricamente, el algoritmo utilizado para crear guids era incorporar la dirección MAC desde un adaptador de red, además de algunas otras cosas como la hora. No estoy seguro si el algoritmo ha cambiado. Aunque ciertamente no es aleatorio, se garantiza que es único.