2009-12-06 22 views
3

Je suis sur Linux, qui a la randomisation de disposition d'espace d'adresse. Est-il nécessaire de déclarer un tampon sur la pile, de le laisser non initialisé, et de l'utiliser pour l'entropie, ou puis-je simplement prendre l'adresse de quelque chose déjà sur la pile, le convertir en entier et (sachant que c'est aléatoire pour adresser la randomisation de disposition d'espace) utiliser cet entier pour l'entropie à la place? L'approche du pointeur présente l'avantage de ne générer aucun avertissement du compilateur comme le fait le buffer unitialisé lorsque vous essayez de le manipuler, mais dans mes tests, il semblait que la partie inférieure de l'adresse (peut-être le dernier octet ou deux) passerait de l'invocation à l'invocation. Le tampon d'entropie semblait encore pire, ne contenant souvent rien du tout.J'ai besoin d'une faible entropie. Je sais que je peux utiliser un tampon unitialisé, mais si j'ai juste besoin d'un entier, son adresse suffirait-elle à la place?

Répondre

6

Si vous avez besoin d'entropie faible sur Linux, pourquoi ne pas lire /dev/urandom? C'est une variante non bloquante de /dev/random qui est moins ... aléatoire (mais, encore une fois, non bloquante).

1

Que voulez-vous dire par faible? La source canonique de l'entropie en C (à des fins non cryptographiques) est time de <time.h>.

Accès à une variable non initialisée est un comportement non défini et peut avoir des conséquences imprévisibles sur certaines plates-formes. Ne fais pas ça.

+0

Eh bien, je voulais autre chose que time() et pid. – Modest

2

Qu'est-ce qui ne va pas avec/dev/random?

Ne pas utiliser la mémoire non initialisée pour l'entropie. Surtout pile. Il a tendance à ressembler beaucoup à des séries consécutives. Et c'est assez prévisible et pas très aléatoire.

1

Pourquoi ne pas lire quelques octets de /dev/random ou /dev/urandom?

3

Fondamentalement, si vous avez besoin d'entropie pour quoi que ce soit, vous devez le prendre à partir d'une source extérieure, pas une bizarrerie du compilateur, ou les attentes de mise en page d'allocation de mémoire. Il n'y a aucune garantie que le compilateur vous donnera des pointeurs différents. Vous pourriez écrire du code qui fonctionne bien sur un système, mais qui échoue complètement à donner de l'entropie à un autre.

Comme d'autres l'ont suggéré, en utilisant/dev/est une bonne idée au hasard. Si ce n'est pas disponible, vous pourriez vous en sortir en appelant la fonction time() (time.h) si vous avez juste besoin d'une petite entropie. Cependant, je suis très inquiet quand les gens demandent juste une petite entropie parce que cela suggère une sorte de confiance sur une valeur aléatoire. Avoir seulement une petite entropie signifie qu'il retournera souvent la même valeur, ce qui pourrait causer une défaillance inattendue du système. Ma forte recommandation est de toujours obtenir une bonne entropie de sources comme/dev/random.