web-dev-qa-db-fra.com

Quelle doit être la durée d'un nonce aléatoire?

NIST fournit bonnes directives sur la longueur des clés et des hachages pour divers algorithmes . Mais je ne vois rien de particulier sur la longueur d'un aléatoire ou d'un pseudo-aléatoire nonce (nombre utilisé une fois).

S'il y a une seule bonne réponse pour une variété d'utilisations, j'adorerais voir cela. Mais pour rendre cela concret, je vais utiliser la situation courante de "réinitialisation du mot de passe via e-mail", dans laquelle le serveur génère une URL avec un composant de chemin pseudo-aléatoire. Cela semble un peu similaire à l'authentification HTTP Digest, dans laquelle le exemple dans la RFC semble avoir 136 bits (dcd98b7102dd2f0e8b11d0f600bfb0c093).

Je note que beaucoup de gens semblent utiliser des UUID de la version 4 (qui fournissent 122 bits pseudo-aléatoires) ou cela, comme indiqué à Les GUID sont-ils sûrs pour les jetons à usage unique? , bien que l'utilisateur doive se méfier de l'utilisation des versions UUID beaucoup plus prévisibles précédentes, et méchantes attaques locales persistantes contre le générateur de nombres aléatoires Windows qui étaient principalement patché d'ici 2008.

Mais en ignorant le risque de s'emmêler dans les versions et implémentations UUID, combien de bits pseudo-aléatoires doivent être incorporés dans l'URL?

35
nealmcb

Un nonce 64 bits est probablement plus que suffisant pour la plupart des applications pratiques, si les 64 bits sont aléatoires de qualité cryptographique.

Pourquoi 64 bits suffisent-ils? Permettez-moi d'exposer le type de raisonnement que vous pouvez utiliser pour répondre à cette question. Je suppose que c'est une URL à usage unique limitée dans le temps; après avoir été utilisé une fois, il n'est plus valide et après un certain temps (3 jours, par exemple), il expire et n'est plus valide. Étant donné que le nonce n'a de sens que pour le serveur, la seule façon pour un attaquant de tenter une supposition est d'envoyer la supposition 64 bits au serveur et de voir comment le serveur répond. Combien de suppositions l'attaquant peut-il essayer avant l'expiration du nonce? Disons que l'attaquant peut faire 1000 requêtes HTTP par seconde (c'est un attaquant assez costaud); alors l'attaquant peut gagner environ 1000 * 3600 * 24 * 3 = 228 devine dans un délai de 3 jours. Chaque supposition a un 1/264 chance d'avoir raison. Par conséquent, l'attaquant a au plus un 1/236 chance de briser le régime. Cela devrait être plus que suffisamment sécurisé pour la plupart des paramètres.

23
D.W.

Tout d'abord, estimez le nombre maximal d'utilisations de votre système (le nombre de fois qu'un nonce aléatoire sera généré). Ensuite, décidez d'un niveau de sécurité acceptable, c'est-à-dire à quel point il doit être improbable qu'un nonce soit un double d'un ancien. Calculez le nombre d'utilisations en bits, doublez-le et ajoutez l'improbabilité dont vous avez besoin en bits et vous avez votre longueur nonce.

Un exemple de AES-GCM avec IV aléatoire. Le nombre d'appels autorisés avec IV aléatoire pour une certaine clé est de 232. La probabilité qu'une IV soit réutilisée doit être inférieure à 2-32. La longueur nonce requise pour cela est de 32 × 2 + 32 == 96 bits.

Si, par hypothèse, vous souhaitez pouvoir générer 296 paquets, chacun avec un nonce aléatoire et voudrait que la probabilité d'un nonce en double soit inférieure à 2-32, vous auriez besoin d'un nonce de 96 × 2 + 32 == 224 bits.

En comparant cela à la réponse ci-dessus de 64 bits ... si vous en avez plus de 216 (65536) utilisations de votre système, la probabilité d'avoir un nonce en double pendant cette période est supérieure à 2-32 (plus de 1 sur 4 milliards, petite échelle). Cela peut être tout à fait acceptable, selon vos exigences de sécurité, ou il peut ne pas l'être.

Comme une réponse unique pour tous - les UUID aléatoires mentionnés sont une solution assez correcte.

Notez que ces valeurs sont approximations, et les calculs les plus précis sont beaucoup plus complexes.

7
Nakedible