Python SystemRandom / os.urandom aura-t-il toujours assez d’entropie pour une bonne cryptographie?

J’ai un générateur de mot de passe:

import random, ssortingng def gen_pass(): foo = random.SystemRandom() length = 64 chars = ssortingng.letters + ssortingng.digits return ''.join(foo.choice(chars) for _ in xrange(length)) 

Selon les documents, SystemRandom utilise os.urandom qui utilise / dev / urandom pour lancer des bits de cryos aléatoires. Sous Linux, vous pouvez obtenir des bits aléatoires depuis / dev / urandom ou / dev / random, ils utilisent tous les deux l’entropie que le kernel peut obtenir. La quantité d’entropie disponible peut être vérifiée avec tail / proc / sys / kernel / random / entropy_avail, cela retournera un nombre comme: 129. Plus le nombre d’entropie est élevé, plus le nombre d’entropie est élevé. La différence entre / dev / urandom et / dev / random est que / dev / random ne crache que des bits si entropy_avail est suffisamment élevé (comme au moins 60) et / dev / urandom va toujours cracher des bits. Les documents disent que / dev / urandom est bon pour la crypto et que vous devez uniquement utiliser / dev / random pour les certificates ssl et autres.

Ma question est la suivante: gen_pass sera-t-il utile pour toujours créer des mots de passe de qualité cryptographique? Si j’appelle cette fonction le plus rapidement possible, est-ce que j’arrêterai de recevoir des bits de cryos à un moment donné parce que le pool d’entropie est épuisé?

La question pourrait aussi être la suivante: pourquoi / dev / urandom génère-t-il toujours de puissants bits de cryofréquence sans se soucier de entropy_avail?

Il est possible que / dev / urandom soit conçu de telle sorte que sa bande passante soit limitée par le nombre de cycles que vous pouvez deviner, ce qui sera corrélé à une quantité d’entropie, mais il ne s’agit pas d’une spéculation.

C’est aussi ma première question de stackoverflow alors s’il vous plaît me critiquer. Je suis préoccupé par le fait que j’ai donné beaucoup de contexte quand quelqu’un qui connaît la réponse connaît probablement le contexte.

Merci

mettre à jour

J’ai écrit du code pour examiner le pool d’entropie pendant que le /dev/urandom était lu depuis:

 import subprocess import time from pygooglechart import Chart from pygooglechart import SimpleLineChart from pygooglechart import Axis def check_entropy(): arg = ['cat', '/proc/sys/kernel/random/entropy_avail'] ps = subprocess.Popen(arg,stdout=subprocess.PIPE) return int(ps.communicate()[0]) def run(number_of_tests,resolution,entropy = []): i = 0 while i  10: modnum += 1 return get_x_axis(rng) return filter(lambda x:x%modnum == 0,range(rng + 1)[1:]) modnum = 1 run(500,.1) 

Si exécutez ceci et exécutez également:

 while 1 > 0: gen_pass() 

Ensuite, je trouve assez fidèlement un graphique qui ressemble à ceci: entrer la description de l'image ici

Faire le graphe en exécutant cat /dev/urandom semble plus simple et cat /dev/random tombe à rien et rest très rapide (ceci ne se lit que comme un octet toutes les 3 secondes environ)

mettre à jour

Si je lance le même test mais avec six instances de gen_pass (), j’obtiens ceci: entrer la description de l'image ici

Donc, il semble que quelque chose fasse que je suis assez entropique. Je devrais mesurer le taux de génération de mots de passe et veiller à ce qu’il soit effectivement plafonné, car si ce n’est pas le cas, il se peut que quelque chose de louche se produise.

mettre à jour

J’ai trouvé cette chaîne d’email

Ceci indique que l’urandom cessera de tirer l’entropie une fois que le pool ne contient plus que 128 bits. Ceci est très cohérent avec les résultats ci-dessus et signifie que dans ces tests, je produis souvent des mots de passe indésirables.

Mon hypothèse était que si entropy_avail était suffisamment élevé (disons au-dessus de 64 bits), la sortie de /dev/urnadom était bonne. Ce n’est pas le cas, il semble que /dev/urandom été conçu pour laisser une entropie supplémentaire pour /dev/random au cas où il en aurait besoin.

Maintenant, j’ai besoin de savoir combien de vrais bits aléatoires un appel SystemRandom nécessite.

Il y a une différence subtile entre la sortie de /dev/random et /dev/urandom . Comme cela a été souligné, /dev/urandom ne bloque pas. C’est parce qu’il tire son résultat d’un générateur de nombres pseudo-aléatoires, issu des nombres aléatoires “réels” dans /dev/random .

La sortie de /dev/urandom sera presque toujours suffisamment aléatoire – c’est un PRNG de haute qualité avec une graine aléatoire. Si vous avez vraiment besoin d’une meilleure source de données aléatoires, vous pouvez envisager d’obtenir un système avec un générateur de nombres aléatoires matériel – mon netbook contient un VIA C7, qui peut générer beaucoup de données correctement aléatoires (99.9 kb / s sur / dev / random, 545kb / s sur / dev / urandom).

En passant, si vous générez des mots de passe, vous voudrez peut-être regarder pwgen – il crée de jolis mots de passe prononçables :).

/dev/random/ bloquera la lecture si elle nécessite plus d’entropie. /dev/urandom/ ne le fera pas. Donc, oui, si vous l’utilisez trop vite, vous manquerez d’entropie. Probablement encore assez difficile à deviner, bien sûr, mais si vous êtes vraiment inquiet, vous pouvez lire les octets de /dev/random/ place. Idéalement, avec une boucle de lecture non bloquante et un indicateur de progression, vous pouvez déplacer la souris et générer de l’entropie si nécessaire.

Vous pourriez vouloir lire ceci pour savoir pourquoi / dev / urandom est la voie à suivre:

http://www.2uo.de/myths-about-urandom/