Lecture depuis dev / urandom - comportement du système

Aug 24 2020

Lors de la lecture de dev/urandom, avec dire headou dd, il est bien sûr prévu que la sortie soit toujours aléatoire et différente.

Comment cela est-il géré par UNIX à un bas niveau? Le fichier est-il naturellement tronqué à la lecture ou est-ce que le fichier est en fait une interface pour un chiffrement symétrique ou équivalent et en tant que tel, la «lecture» est en fait l'acte d'exécuter le chiffrement.

Réponses

13 StephenKitt Aug 24 2020 at 21:15

/dev/urandomest un périphérique de caractères, pas un fichier ordinaire. L'ouvrir fournit une interface à un pilote, généralement dans le noyau, qui gère les lectures; chaque fois qu'un programme lit à partir de /dev/urandom, un appel est fait au pilote, et le pilote détermine comment fournir le contenu approprié (comme tout autre périphérique de caractères - /dev/null, /dev/zero...).

Sous Linux, ceci est implémenté dans drivers/char/random.c. Il maintient un «pool d'entropie», amorcé à partir de diverses sources de données aléatoires, et lorsqu'il est lu, traite les données du pool en utilisant un chiffrement de flux ChaCha pour construire les données à renvoyer.

8 Ángel Aug 24 2020 at 21:44

/dev/urandomn'est pas un 'fichier normal' (oui, c'est la dénomination POSIX), c'est un périphérique. Tout comme la plupart des 'fichiers' sur / dev /, vous avez donc beaucoup de comportements magiques.

  • Vous avez /dev/null, où peu importe combien vous écrivez, ça ne se remplit jamais
  • Vous avez random / urandom / srandom, fournissant au hasard des données différentes à chaque fois
  • Vous avez /dev/tty(et vos collègues) où vous interagissez avec un terminal
  • Vous avez /dev/fullqui renvoie toujours "Aucun espace laissé sur l'appareil" pour toute tentative d'écriture
  • Vous avez /dev/zeroqui renvoie un ensemble infini d'octets nuls

et beaucoup plus.

Ces fichiers sont en fait une interface pour interagir avec un module du noyau. Ainsi, lorsque vous le «lisez», il exécute en fait une fonction à laquelle il est demandé de lire autant d'octets que votre programme (head, dd, etc.) a demandé ( /dev/urandomest un périphérique de caractères ). Cette fonction le gère ensuite en interne (sur la base de plusieurs pools d'entropie) afin de remplir ce tampon (dans ce cas, afin que vous obteniez un contenu pseudo-aléatoire).