Question

Hier, j'ai demandé à Are GUID généré sur Windows 2003 en toute sécurité à utiliser comme identifiant de session? et réponse combinée avec cet article Les GUID sont globalement uniques, mais les sous-chaînes de GUID ne sont pas invoquées pour que je remplace mon mécanisme actuel d'utilisation des GUID comme identifiants de session dans les cookies.

Parce que la modification est un peu fastidieuse, j'ai décidé de lancer un test rapide de GUID sur mon PC Vista pour voir si une séquence de GUID était manifestement déterministe (ce qui m'inquiète, c'est si un attaquant parvient à obtenir une séquence de GUID générés par mon serveur, ils pourraient en générer de nouveaux correspondants).

Dans l'article de Raymond Chen (qui fait référence à cette très ancienne spécification UUID et GUID à partir de 1998) le GUID est composé de:

  • 60 bits d'horodatage,
  • identifiant d'ordinateur 48 bits,
  • 14 bits d'uniquificateur et
  • six bits sont fixes

Si je génère 10 GUID, les 15 premiers caractères ASCII (à l'exception de '-') sont l'horodatage, les 12 prochains caractères ASCII sont l'identifiant de l'ordinateur, les 3,5 prochains caractères ASCII sont aléatoires et les 1,5 derniers caractères sont fixes. .

Obtenir 10 GUID sur un PC Vista à l’aide de .Net System.Guid.NewGuid () donne:

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

Le seul motif qui ressort d’une inspection visuelle rapide est que le 13ème caractère ASCII est toujours égal à 4.

Je me demande encore une fois si se fier à System.Guid pour générer des identifiants de session pseudo-aléatoires est suffisamment puissant pour protéger une application Web où fendre un identifiant de session aurait une valeur maximale de plusieurs milliers de dollars.

Mise à jour: au lieu d'utiliser un GUID, je prévois maintenant de générer mes identifiants de session en utilisant l'approche ci-dessous. Je suis en train de convertir le nombre aléatoire de 384 bits en une chaîne d'octets de 0x00, de sorte qu'il puisse être utilisé dans un 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);
Était-ce utile?

La solution

Ce n'est pas une réponse complète, mais je peux vous dire que le 13ème chiffre hexadécimal est toujours égal à 4 car il désigne la version de l'algorithme utilisé pour générer le GUID (id est, v4); aussi, et je cite Wikipedia:

  

Cryptanalyse du GUID WinAPI   générateur montre que, depuis le   séquence de GUID V4 est pseudo-aléatoire,   étant donné l'état initial on peut   prévoir jusqu'à 250 000 GUID suivants   retourné par la fonction UuidCreate.   C’est pourquoi les GUID ne doivent pas être utilisés   en cryptographie, par exemple, en tant que clés aléatoires.

Le reste de l'article et ses références: http://en.wikipedia.org/wiki/ Guid

- Modifier -

Du point de vue de la sécurité, je vous suggèrerais de générer votre identifiant de session comme bon vous semble, puis de le signer de manière cryptographique; De cette façon, vous pouvez rassembler toutes les informations que vous souhaitez et ensuite apposer une signature sur la fin - le problème possible étant le compromis entre la taille / la force de votre clé et la taille résultante du cookie. Les GUID sont utiles comme identifiants, mais je n’aurais recours qu’à une technique cryptographique dédiée à la sécurité.

Autres conseils

Je vous suggère d'utiliser le System.Security.Cryptography.RandomNumberGenerator . Ceci est conçu pour produire des nombres qui ne peuvent pas être modifiés. La motivation de Guid est d'être unique. Vous pouvez combiner le GUID et le numéro aléatoire sécurisé, mais un nombre aléatoire sécurisé de 128 bits ne risque jamais de se heurter à la pratique.

Quelques notes:

  1. Je doute que toute implémentation de GUID ait été conçue pour être sécurisée par cryptographie. (Et cette supposition serait corroborée par l'article lié au prochain article.)
  2. Le 13ème caractère ASCII est un signifiant de quel algorithme a été utilisé pour générer le GUID .

Si vous êtes vraiment préoccupé par le fait d'avoir des identifiants de session forts, alors un hachage cryptographiquement sécurisé de quelque chose qui ne peut pas être déterminé hors machine est votre meilleure approche. Générer un tampon ponctuel à partir d'un document interne ou d'une source de données fonctionnerait même.

Qu'est-ce que vous essayez de faire? Voulez-vous juste une source de nombres aléatoires?

Découvrez random.org et hotbits . Il y a de nombreuses années, j'avais une bibliothèque Java qui rassemblait des nombres à partir de ces sources et les reliait pour obtenir une assez belle série aléatoire (même si cela suppose que les deux sites ne sont pas en cahootz).

La réponse courte est qu’aucun GUID n’est suffisamment puissant pour générer des identifiants de session si vous souhaitez empêcher les identifiants de session et les fissures.

Pour la même raison pour laquelle vous ne voudriez pas utiliser un GUID en tant que clé AES, vous ne voulez pas les utiliser pour aucun type d'identifiant sensible.

Un GUID fonctionne extrêmement bien pour ce qu’il est conçu: un identifiant unique garanti mathématiquement à ne jamais répéter.

Même si craquer un identifiant de session ne vaut que 1000 $, imaginez si c'est fait 100 fois. Maintenant, vous parlez de bling sérieux.

Je sais que c’est un moyen simple d’utiliser un GUID, mais il faut résister et gérer la douleur en prenant les précautions qui s'imposent pour sécuriser correctement votre application. Vos utilisateurs vous remercieront.

Il est presque impossible d’obtenir un double guide en considérant les possibilités de l’obtenir. Voici quelques faits mathématiques rapides

Grains de sable dans le monde 75 000 000 000 000 000 000

Nombre de GUID 340,282,366,920,938,463,463,374,607,431,770,000,000

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top