Je vois que de nombreux sites utilisent des GUID pour la réinitialisation des mots de passe, les demandes de désabonnement et d'autres formes d'identification unique.
Vraisemblablement, ils sont attrayants car ils sont faciles à générer, uniques, non séquentiels et semblent aléatoires.
Mais sont-ils suffisamment sûrs à ces fins?
Il me semble qu'étant donné un GUID, il est possible de prédire les GUID suivants car (pour autant que je sache), ils ne sont pas destinés à être sécurisés cryptographiquement ... ou le sont-ils?
Remarque:
http://example.com/forgotPassword/?id=b4684ce3-ca5b-477f-8f4d-e05884a83d3c
Sont-ils suffisamment sûrs pour les fins que vous avez décrites? À mon avis, généralement oui. Sont-ils suffisamment sûrs dans les applications où la sécurité est une préoccupation importante? Non. Ils sont générés à l'aide d'un algorithme non aléatoire, ils ne sont donc en aucun cas cryptographiquement aléatoires ou sécurisés.
Donc, pour une fonction de désabonnement ou de vérification d'abonnement, je ne vois vraiment pas de problème de sécurité. D'un autre côté, pour identifier un utilisateur d'une application de banque en ligne (ou même probablement une fonction de réinitialisation de mot de passe d'un site où l'identité est précieuse), les GUID sont définitivement inadéquats.
Pour plus d'informations, vous voudrez peut-être consulter section 6 (considérations de sécurité) de la RFC 4122 pour les GUID (ou identificateurs universellement uniques).
spécification UUID détaille plusieurs "versions" qui sont des méthodes pour générer l'UUID. La plupart visent à garantir l'unicité (c'est le point principal de l'UUID) en utilisant, par exemple, la date actuelle. Ceci est efficace mais signifie que si l'UUID généré est unique, il l'est aussi prévisible, ce qui les rend inadéquats pour certains usages de sécurité.
La méthode de génération d'UUID "version 4" (dans la section 4.4) , cependant, est censée utiliser un générateur de nombres aléatoires cryptographiquement fort. 6 des 128 bits sont fixés à une valeur conventionnelle (pour indiquer qu'il s'agit d'un UUID version 4, à savoir), ce qui laisse 122 bits du RNG.
Si le RNG sous-jacent est sécurisé (par exemple /dev/urandom
Sur un système Linux/MacOS/* BSD, ou CryptGenRandom()
sous Windows), étant donné les nombreux UUID générés, un attaquant n'est pas censé être en mesure de prédire le suivant avec une probabilité de réussite supérieure à 2-122, qui est suffisamment petit pour la plupart des utilisations, y compris les codes de lancement des missiles nucléaires.
122 bits aléatoires garantissent l'unicité avec une forte probabilité. Si vous générez de nombreux UUID version 4 et les accumulez, vous pouvez vous attendre à rencontrer votre première collision après environ 261 UUID - c'est environ 2 milliards de milliards; simplement stocker ce nombre d'UUID utiliserait plus de 30 millions de téraoctets. Si vous considérez "seulement" 1012 un tel UUID (mille milliards, stockable sur 16 téraoctets), alors les risques d'avoir deux UUID identiques parmi ceux-ci sont d'environ 9,4 * 10-14, c'est-à-dire environ 700 mille fois moins probable que de gagner des millions de dollars à la loterie.
Par conséquent, l'UUID sont approprié pour des raisons de sécurité si (et seulement si) ce sont des UUID "version 4" générés avec un RNG sécurisé.
Ils sont sécurisés sur Windows 2000 ou plus récent. Votre vulnérabilité et votre risque dépendent de la façon dont le GUID est généré. Windows 2000 ou une version plus récente utilise la version 4 du GUID qui est cryptographiquement sécurisée).
Pour plus d'informations, voir ce lien MSDN et ceci question de débordement de pile . (Merci à Jordan Rieger dans les commentaires)
Si vous utilisez un langage de développement commun, créer un générateur à un coup de nombres aléatoires uniques en utilisant une fonction de chiffrement appropriée n'est pas si difficile (nous parlons de 10 lignes de code qui sont disponibles en tant qu'exemples dans les langues les plus courantes en utilisant simplement Google ) et donc en utilisant un nouveau guide simple, c'est essentiellement de la paresse du point de vue du développeur.
Dans le scénario décrit, ils sont "suffisamment sécurisés", si le Guid passé dans la fonction de mot de passe oublié a quelques fonctionnalités de base:
1) C'est vraiment une valeur unique qui n'a aucune relation avec l'ID utilisateur, donc, une fois le mot de passe réinitialisé, ne peut plus être utilisé
2) Il a une fenêtre de temps définie pour sa validité (vous pouvez réinitialiser le mot de passe dans les 30 prochaines minutes ou quelque chose comme ça)
Si vous utilisez le même Guid, vous pouvez réinitialiser le mot de passe plusieurs fois ou deviner le guid et réinitialiser le mot de passe des utilisateurs qui n'ont pas demandé de réinitialisation du mot de passe ou, comme Avid le décrit dans le commentaire, essayez d'obtenir l'accès à la réinitialisation du mot de passe à l'aide d'une sorte de rejouer attacher alors c'est la conception de l'application qui est défectueuse et l'utilisation ou non d'un Guid n'est pas le vrai problème.
Donc, si vous ne traitez pas d'informations très sensibles, un guide pourrait peut-être fonctionner, mais pourquoi ne pas faire les choses correctement la première fois et utiliser une api de chiffrement appropriée pour générer une chaîne aléatoire sécurisée?
Cordialement Massimo
Faux "GUID", qui sont pas générés par un algorithme de génération GUID, mais qui sont simplement 128 bits (16 octets) générés par un PRNG cryptographiquement sécurisé, et qui sont simplement représentés en utilisant le codage conventionnel GUID hex-with-hyphens, sont principalement sûrs pour les jetons à usage unique.
Cependant, vous rencontrez le problème d'anniversaire, car l'existence d'une collision est d'environ 2 ^ -64 pour les jetons de 128 bits.
Mieux vaut utiliser des jetons 256 bits ou 512 bits, où l'existence d'une collision est d'environ 2 ^ -128 ou 2 ^ -256.