web-dev-qa-db-fra.com

/ dev / random Extrêmement lent?

Quelques informations générales: je cherchais à exécuter un script sur un serveur Red Hat pour lire certaines données de/dev/random et utiliser la commande Perl unpack () pour la convertir en une chaîne hexadécimale pour une utilisation ultérieure (opérations de base de données d'analyse comparative). J'ai couru quelques "head -1" sur/dev/random et ça semblait bien marcher, mais après l'avoir appelé plusieurs fois, ça allait juste se bloquer. Après quelques minutes, il sortirait finalement un petit bloc de texte, puis terminerait.

Je suis passé à/dev/urandom (je ne voulais vraiment pas, c'est plus lent et je n'ai pas besoin de cette qualité d'aléatoire) et cela a bien fonctionné pour les deux ou trois premiers appels, puis il a également commencé à se bloquer. Je me demandais si c'était la commande "head" qui la bombardait, alors j'ai essayé de faire des E/S simples en utilisant Perl, et elle aussi était suspendue. Comme dernier effort, j'ai utilisé la commande "dd" pour en vider certaines informations directement dans un fichier au lieu du terminal. Tout ce que je lui ai demandé, c'était 1 Mo de données, mais il m'a fallu 3 minutes pour obtenir environ 400 octets avant de le tuer.

J'ai vérifié les listes de processus, le CPU et la mémoire étaient fondamentalement intacts. Qu'est-ce qui pourrait provoquer/dev/random comme ça et que puis-je faire pour l'empêcher/le réparer à l'avenir?

Edit: Merci pour l'aide les gars! Il semble que j'aie mélangé au hasard et urandom. J'ai le script opérationnel maintenant. On dirait que j'ai appris quelque chose de nouveau aujourd'hui. :)

41
Mr. Llama

Sur la plupart des systèmes Linux, /dev/random est alimenté par l'entropie réelle recueillie par l'environnement. Si votre système ne fournit pas une grande quantité de données à partir de /dev/random, cela signifie probablement que vous ne générez pas suffisamment de aléas environnementaux pour l'alimenter.

Je ne sais pas pourquoi vous pensez /dev/urandom est de qualité "plus lente" ou supérieure. Il réutilise un pool d'entropie interne pour générer une pseudo-aléatoire - ce qui en fait une qualité légèrement inférieure - mais il ne bloque pas. En général, les applications qui ne nécessitent pas de cryptographie de haut niveau ou à long terme peuvent utiliser /dev/urandom fiable.

Essayez d'attendre un peu, puis lisez dans /dev/urandom encore. Il est possible que vous ayez épuisé la lecture du pool d'entropie interne depuis /dev/random, brisant les deux générateurs - permettre à votre système de créer plus d'entropie devrait les reconstituer.

Voir Wikipedia pour plus d'informations sur /dev/random et /dev/urandom.

47
Tim

Cette question est assez ancienne. Mais toujours d'actualité donc je vais donner ma réponse. De nombreux processeurs sont aujourd'hui livrés avec un générateur de nombres aléatoires (RNG) intégré. De nombreux systèmes sont également livrés avec un module de plateforme de confiance (TPM) qui fournit également un RNG. Il existe également d'autres options qui peuvent être achetées, mais il est probable que votre ordinateur possède déjà quelque chose.

Vous pouvez utiliser rngd à partir du paquetage rng-utils sur la plupart des distributions Linux pour générer plus de données aléatoires. Par exemple, sur Fedora 18, tout ce que j'avais à faire pour activer l'amorçage à partir du TPM et du CPU RNG (instruction RDRAND) était:

# systemctl enable rngd
# systemctl start rngd

Vous pouvez comparer la vitesse avec et sans rngd. C'est une bonne idée d'exécuter rngd -v -f depuis la ligne de commande. Cela vous montrera les sources d'entropie détectées. Assurez-vous que tous les modules nécessaires à la prise en charge de vos sources sont chargés. Pour utiliser TPM, il doit être activé via les outils tpm. mise à jour : voici un Nice howto .

BTW, j'ai lu sur Internet certaines préoccupations concernant le TPM RNG souvent cassé de différentes manières, mais je n'ai rien lu de concret contre les RNG trouvés dans les puces Intel, AMD et VIA. Utilisation de plus d'une source serait préférable si vous vous souciez vraiment de la qualité de l'aléatoire.

urandom est bon pour la plupart des cas d'utilisation (sauf parfois lors d'un démarrage précoce). De nos jours, la plupart des programmes utilisent urandom plutôt qu'aléatoire. Même openssl fait cela . Voir mythes sur l'urandom et comparaison d'interfaces aléatoires .

Dans les versions récentes de Fedora et RHEL/CentOS , les outils rng prennent également en charge entropie de gigue . Vous pouvez le faire par manque d'options matérielles ou si vous lui faites plus confiance que votre matériel.

MISE À JOUR: une autre option pour plus d'entropie est A FORGÉ (qualité mise en doute). Sur les machines virtuelles, il y a un kvm/qemu VirtIORNG (recommandé).

21
akostadinov

utilisez/dev/urandom, son cryptographiquement sécurisé.

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

"Si vous ne savez pas si vous devez utiliser/dev/random ou/dev/urandom, alors vous voudrez probablement utiliser ce dernier."

En cas de doute au démarrage, si vous avez suffisamment d'entropie. utilisez plutôt l'appel système getrandom(). [1] Son meilleur des deux mondes,

  • il bloque jusqu'à ce qu'une seule entropie soit rassemblée,
  • après cela, il ne bloquera plus jamais.

[1] git kernel commit

10
harmv

Si vous voulez plus d'entropie pour /dev/random alors vous devrez soit acheter un RNG matériel, soit utiliser un des * _ démons entropides pour le générer.

1

Si vous utilisez l'aléatoire pour les tests (pas la cryptographie), alors l'aléatoire répétable est meilleur, vous pouvez l'obtenir avec un pseudo-aléatoire commençant à une graine connue. Il existe généralement une bonne fonction de bibliothèque pour cela dans la plupart des langues.

Il est reproductible, lorsque vous rencontrez un problème et essayez de déboguer. Il ne mange pas non plus l'entropie. Peut être la graine du générateur pseudo aléatoire de/dev/urandom et enregistrer la graine dans le journal de test. Perl possède un générateur de nombres pseudo aléatoires que vous pouvez utiliser.

1
ctrl-alt-delor

Cela m'a arrangé. Utilisez le nouveau SecureRandom () au lieu de SecureRandom.getInstanceStrong ()

Quelques informations supplémentaires peuvent être trouvées ici: https://tersesystems.com/blog/2015/12/17/the-right-way-to-use-securerandom/

0
nke