61 votes

Dans quelle mesure les GUID sont-ils inaccessibles?

Il y a un moment, j'ai travaillé sur une application web où les utilisateurs peuvent acheter des billets. En raison de la façon dont notre client, processus travaillé, ce que vous avez effectivement obtenu à la suite de votre achat a été une URL avec le numéro de ticket en elle.

Ces billets à acheter une propriété dans le Moyen-Orient, et chaque billet était potentiellement une valeur d'environ de 3 000 000$. Clairement distribue séquentielle entiers aurait été une mauvaise idée. Nous avons utilisé Guid comme ils sont fondamentalement impossible à deviner, mais ma question est: sont-ils suffisamment sécurisé?

Si je comprends bien, le Guid .NET produit sont totalement pseudo-aléatoire (à l'exception de quelques non variable de bits). Cependant, je ne sais pas quel algorithme est utilisé pour les générer.

La documentation MSDN nous dit qu' Random est rapide et l'insécurité, et RNGCryptoServiceProvider est lent et sûr. C'est, il est raisonnable de supposer que quelqu'un pourrait mettre dans l'effort, de prédire le résultat d' Random, mais pas de RNGCryptoServiceProvider.

Si vous avez vu une assez longue séquence de Guid, serait-il possible de prédire les futures sont-elles? Si oui, combien auriez-vous besoin de voir?

[Dans notre cas particulier, il y avait la sécurité physique des vérifications plus tard, il fallait présenter le passeport que vous avez utilisé pour acheter votre ticket de sorte qu'il n'aurait pas été trop mauvais si quelqu'un l'avait deviné de quelqu'un d'autre GUID, nous n'avons donc pas de sueur, à l'époque. La commodité d'utiliser le GUID comme une clé de base de données fait une utile type de données à utiliser.]


Edit:

Si la réponse est "pas assez".

À l'aide de 0xA3's réponse ci-dessous, et suivre les liens à partir de la question qu'il a lié pour, le code suivant génère un niveau de chiffrement aléatoire GUID valide par la Section 4.4 de la norme 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);
}

Ce produit Guid beaucoup plus lentement que d' Guid.NewGuid(), mais avec 122 bits de "très aléatoire" des données, ils sont en sécurité imprévisible.

Bien sûr, tout chiffrée de manière aléatoire texte aurait fait pour un numéro de billet, mais les Guid sont assez pratique. :-)

Comme avec d'autres version 4 Guid il n'y a pas de garantie absolue de l'unicité, mais les chances sont impressionnants. Tant que vous avez moins de 326,915,130,069,135,865 (c'est à dire sqrt(-2*2^122*ln(0.99))) Guid en jeu simultanément, vous pouvez être plus de 99% sûr qu'il y a pas de collisions. Mettre une autre manière: si comme le mien, votre application devra erreurs de dépassement de tous sur la place si vous avez plus d' int.MaxValue de à peu près tout, vous pouvez être plus de 99.9999999999999999% sûr de pas de collisions (e^-(((2^31-1)^2)/(2*2^122))). C'est environ mille fois plus sûr que vous pouvez être qu'une météorite ne pas éliminer la plupart de la vie sur Terre dans la seconde de l'application live (c'est à dire une par de 100 millions d'années).

35voto

0xA3 Points 73439

Uuid/Guid sont spécifiés par RFC4122. Bien que la Version 4 Uuid sont créés à partir de nombres aléatoires de l'Article 6 fait une déclaration explicite sur la sécurité:

Ne présumez pas que les Uuid sont difficiles à deviner; ils ne doivent pas être utilisés comme les capacités de sécurité (identificateurs dont la simple possession de subventions l'accès), par exemple. Prévisible nombre aléatoire de la source aggraver la situation.

Une bonne discussion de l'aspect aléatoire de Guid peuvent également être trouvés dans cette question:

Comment le Hasard est le Système.Guid.NewGuid()? (Prendre deux)

14voto

Rusty Points 2012

C'est un parfait exemple de comment ne pas penser à un problème de sécurité. Malheureusement, c'est la façon dont une majorité de développeurs pensent à propos de la sécurité...

...potentiellement une valeur d'environ De 3 000 000 $...sont-ils suffisamment sécurisé ?...

Pas de. Beaucoup de ressources peut être amené à porter sur un problème qui est possible d'obtenir un gain de 3 M$par billet. Ce genre d'argent pourrait attirer des gens avec beaucoup de ressources...des gens très sérieux. À l'aide de tout ce qui s'appuie sur un objectif général de générateur de nombre aléatoire n'est pas très aléatoire...donc pas très sûr. C'est plus de l'obscurcissement de la cryptographie.

...physique des vérifications de sécurité...ont présenter le passeport utilisé...

Encore une fois, avec cette quantité de cheddar sur la ligne... je peux vous obtenir un passeport vous le souhaitez.

...possible de prévoir à terme chers?...

Oui. La question est...Combien de temps cela prendrait-il ? ...par une unité de traitement de travail.

...Si oui, combien auriez-vous besoin d' de voir ?...

Cela dépend de ce que je sais au sujet de leur création...OS, CPU, etc...et je suis sûr que je peux trouver quelqu'un dans votre entreprise qui serait intéressée à fournir certaines informations en échange de dire...de 100 000$ou, plus probablement, de moins en moins.

-- Cela peut sembler un peu trop dramatique, mais vous parlez d'un sérieux montant d'argent, et il doit être protégé avec un montant graves de sécurité. Vous avez besoin d'une sécurité cabinet de conseil qui peut vous aider à choisir le package de chiffrement que vous achetez pour cela. Vos clients doivent être en mesure de les aider par le biais de leur service de gestion des risques ou de leur assureur....Si non, obtenir votre propre avocat...celui que vous avez déjà.

Bien sûr, il y a très peu de chance que quelque chose allait mal se passer avec le GUID régime, mais si vous n'avez aller tous en forme de poire...Comment allez-vous dire à tous ces avocats que votre plan de sécurité était top et ils devraient aller voir ailleurs ?...Faites-moi confiance, vous ne voulez pas être en tenant le sac si quelque chose va mal. Ce serait vraiment horrible pour vous.

Edit: Sur teedyay commentaire...

Obtenir un "Sortir de Prison Gratuitement" de la carte du client est toujours une bonne idée. Si vous leur dites "Nous pouvons le faire en sécurité dans le cas de trivial attaques...mais nous ne sommes pas un de sécurité ou de cryptographie de l'entreprise.", alors votre travail est terminé et que le client est à gauche tenant le sac.

8voto

JaredPar Points 333733

GUIDs sont générés par un très bien connu de l'algorithme. Il n'y a pas de hasard intégré, comme on sait, des valeurs telles que la carte réseau de l'ID et ces données sont utilisées pour les générer.

Ils devraient jamais être utilisés comme un moyen de sécurité.

MODIFIER

Il apparaît version plus récente de l' GUID/UUID algorithme ne plus utiliser l'adresse matérielle pour les parties de leurs valeurs et utiliser à la place de nombres pseudo-aléatoires. Mais ce ne sont pas vraiment au hasard, et encore ne doit pas être utilisé pour la sécurité des applications critiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X