2011-01-25 6 views
11

Para iniciar y definir guid, estoy usando un .NET framework Guid Esto es algo una situación hipotética Los usuarios al realizar una acción específica tienen guids generados. Cada usuario puede ver sus propias guías. Si un usuario conociera una de las pautas de otro usuario, habría un compromiso de seguridad.¿Se puede confiar en las guías para la seguridad, o son predecibles si se puede forzar al sistema a generar muchas guías conocidas?

¿Qué tan seguro es este sistema si asumimos que un usuario no tiene forma de robar el GUID de otro usuario y solo puede adivinarlo?

Entiendo que es imposible adivinar ciegamente guids. Incluso si tuvieran un millón de valores de éxito, todavía tendrían una probabilidad de 10^20 de una conjetura exitosa

Donde tengo miedo de que exista un problema es la predicción de guía. ¿Puede un usuario generar un gran número de solicitudes, ver las guías que obtuvo y conocer la fórmula de generación .net guid mejora en gran medida sus probabilidades de adivinar? ¿Pueden estas probabilidades reducirse a un punto en el que serían un problema de seguridad? En ese caso, ¿cómo deben generarse las claves de una manera única no adivinable?

Le pido a cualquiera que mencione las probabilidades de conjeturas/colisiones que le agreguen algún significado difícil. Ya sea un número exacto para definir probabilidades, o algo así, "se puede utilizar para almacenar datos de la cuenta, pero los datos no sensibles"

EDIT

esta pregunta parece ir bien en el territorio que originalmente buscaba explorar con esta pregunta Is a GUID a good key for (temporary) encryption?

+1

GUID del no son exclusivos; por lo tanto, en teoría, dos usuarios podrían tener el mismo Guid. –

+0

Probablemente similar a http://stackoverflow.com/questions/4517497/how-secure-are-guids-in-terms-of-predictability –

+0

Para las guías aleatorias generadas correctamente, las posibilidades de colisión son suficientemente bajas para garantizar la singularidad en la práctica. – CodesInChaos

Respuesta

7

Los GUID/UUID están destinados a generar números de 128 bits para su uso principalmente como ID que son únicos (para todos los efectos).

Los UUID no están diseñados para generar secuencias de números aleatorios criptográficamente fuertes, y si desea la máxima impredecibilidad, las secuencias de números aleatorios criptográficamente fuertes son exactamente lo que desea. Para esto, .NET le proporciona el RNGCryptoServiceProvider, diseñado desde cero para ser tan impredecible como pueda lograrse razonablemente por medios algorítmicos, entonces ¿por qué no usarlo?

Ejemplo:

byte[] GenerateRandomBytes() 
{ 
    byte[] key = new byte[16]; 

    System.Security.Cryptography.RNGCryptoServiceProvider c = 
     new System.Security.Cryptography.RNGCryptoServiceProvider(); 

    c.GetBytes(key); 

    return key; 
} 
4

Afaik .net genera Version 4 UUIDs como guías por defecto. Estos son aleatorios y difíciles de adivinar si se implementan correctamente. Pero dado que las versiones futuras podrían usar otra implementación, no confiaría en eso. Creo que incluso las versiones anteriores de Windows o .net usaban Guids basados ​​en Mac-Address que son más fáciles de adivinar.

Así que simplemente usaría uno de los generadores de números cripto-pseudoaleatorios integrados en .NET. Si genera 16 bytes, tiene un reemplazo directo para un Guid.

+2

podría definir "difícil de adivinar". Lo suficientemente seguro para un foro, lo suficientemente seguro para un banco, lo suficientemente seguro para la seguridad nacional – Andrey

+0

Un número aleatorio de 128 bits es lo suficientemente seguro para cualquier cosa (la seguridad nacional requiere ciertos procesos de certificación, por lo que no se puede usar su implementación ad-hoc). La calidad de los números es el problema. Es por eso que recomendé no usar el generador de GUID estándar, sino un crypto-prng en su lugar. – CodesInChaos

+1

Hay otros ataques mucho más probables que adivinar aleatoriamente un número aleatorio válido de ese tamaño. – CodesInChaos

Cuestiones relacionadas