OVH Cloud OVH Cloud

Quel logiciel libre de génération de mots de passe ?

16 réponses
Avatar
David MENTRE
Bonjour,

Je cherche un logiciel libre de génération aléatoire de mots de passe de
« bonne qualité ».

Jusqu'à maintenant j'utilisais /pwgen/ mais il y a un peu trop de
répétition à mon goût dans l'algorithme par défaut pour les mots de
passe facilement mémorisables. Il a une option « --secure » (/completely
random, hard-to-memorize paswords/) mais il n'y a pas de doc sur ce que
fait le logiciel dans ce cas.

Est-ce que quelqu'un connait un bon logiciel ou une bonne méthode pour
générer des mots de passe de qualité ? Une solution simple est peut-être
de prendre 48 ou 64 bits de /dev/random et de le passer dans un encodeur
binaire vers ASCII ?

Amicalement,
david
--
David Mentré

6 réponses

1 2
Avatar
Sylvain
David MENTRE wrote on 26/07/2006 23:13:
Quelques questions supplémentaires sur ton programme.

J'ai modifié le programme pour le rendre plus lisible (pas sûr d'y avoir
réussi). Toute critique, même négative, est bienvenue.


l.34,72 read/open

fread/fopen de stdio.h seraient plus portable que read/open de unistd.h

l.44: val = (unsigned)x;

x est unsigned et plus petit que val, le cast ne sert à rien.

l.45: while (val >= max * (256 / max));

"max * (256 / max)" est une constante qui devrait être évalué un seule
fois (je ne laisserais pas l'optim au bon vouloir du compilo).

l.87: If each password takes 1ms to test ... 69 years

un memcmp(,, 10) prends de l'ordre de 10^-5 ms, soit 6 hrs.

(un temps d'attaque qui ne donne pas son contexte (direct ou via réseau
lent, etc) ne veut rien dire).

Sylvain.

Avatar
fabrice-pas-despame.bacchella
On Thu, 27 Jul 2006 02:08:50 +0200, Sylvain wrote:

On est totalement hors sujet là, mais bon, histoire de pinailler.


fread/fopen de stdio.h seraient plus portable que read/open de unistd.h


C'est surtout pas du tout la même chose, fread/fopen sont un enrobage
bufférisé de read/open. Le premier est dans ISO C90, le second dans
POSIX.1, c'est pas la cata comme portabilité.

l.45: while (val >= max * (256 / max));

"max * (256 / max)" est une constante qui devrait être évalué un seule
fois (je ne laisserais pas l'optim au bon vouloir du compilo).


Ben vous avez tord, un compilo un peu correct est très certainement
capable de faire ça & beaucoup plus encore. Faite un man gcc & compter
le nombre de paramètre -f..., notamment -fmove-loop-invariants,
-funswitch-loops, ça doit être dans le contexte je pense.

Avatar
David MENTRE
Bonjour Sylvain,

Sylvain writes:

l.34,72 read/open

fread/fopen de stdio.h seraient plus portable que read/open de unistd.h


Mouais. read/open fait parti du C. Et c'est beaucoup plus simple, donc
je laisse comme ça.

l.44: val = (unsigned)x;

x est unsigned et plus petit que val, le cast ne sert à rien.


Effectivement, d'après l'annexe A.6 du K&R (version française).

l.45: while (val >= max * (256 / max));

"max * (256 / max)" est une constante qui devrait être évalué un seule
fois (je ne laisserais pas l'optim au bon vouloir du compilo).


Je me fiche un peu de l'optimisation, vu le nombre de fois que cette
boucle est évaluée. Pour moi, c'est plus lisible écrit comme ça.

l.87: If each password takes 1ms to test ... 69 years

un memcmp(,, 10) prends de l'ordre de 10^-5 ms, soit 6 hrs.

(un temps d'attaque qui ne donne pas son contexte (direct ou via réseau
lent, etc) ne veut rien dire).


Effectivement. Le commentaire visait surtout à me donner un ordre de
grandeur (si le temps d'essai diminue d'un facteur 1000, il faut 6 mois
pour tester toutes les combinaisons). J'ai mis un commentaire en ce
sens.

J'ai mis à jour le programme, avec une précision sur la licence de
Thomas : http://www.linux-france.org/~dmentre/code/dev-random-pass-gen.c

Merci pour la relecture,
Amicalement,
d.
--
David Mentré

Avatar
Erwan David
David MENTRE écrivait :

Bonjour Sylvain,

Sylvain writes:

l.34,72 read/open

fread/fopen de stdio.h seraient plus portable que read/open de unistd.h


Mouais. read/open fait parti du C. Et c'est beaucoup plus simple, donc
je laisse comme ça.


Non read/open c'est du Posix. C ne connais que fread/fopen

--
Erwan


Avatar
Erwan David
David MENTRE écrivait :

Bonjour Sylvain,

Sylvain writes:

l.34,72 read/open

fread/fopen de stdio.h seraient plus portable que read/open de unistd.h


Mouais. read/open fait parti du C. Et c'est beaucoup plus simple, donc
je laisse comme ça.


Non read/open c'est du Posix. C ne connais que fread/fopen, et encore
en mode hébergé, pas en mode freestanding.

--
Erwan


Avatar
pornin
According to Sylvain :
l.34,72 read/open

fread/fopen de stdio.h seraient plus portable que read/open de unistd.h


D'un autre côté, pour trouver une machine où il y a un /dev/random mais
pas de open() ni read(), il faut s'accrocher...

(Note : mon code originel utilisait /dev/urandom, pas /dev/random.
C'était voulu. Suivant les OS, /dev/random peut bloquer, sans limite
sur le temps, ce qui peut être très pénible. /dev/urandom -- s'il est
correctement initialisé, ce qui incombe, sous Linux, aux scripts de boot
de la distribution -- n'a pas ce défaut et fait parfaitement l'affaire
cryptographiquement.)


l.44: val = (unsigned)x;

x est unsigned et plus petit que val, le cast ne sert à rien.


La valeur maximale de x n'entre pas en ligne de compte ; on écrit
dans une variable non signée, donc la troncature se passe "bien".
Dans tous les cas, la conversion en "unsigned" est faite, au moins
implicitement ; expliciter cette conversion ne change donc pas le code
produit par le compilateur. C'est une forme de commentaire, censée
indiquer au programmeur que oui, il y a changement de type (et donc
motif de méfiance), mais c'est voulu et contrôlé.


l.45: while (val >= max * (256 / max));

"max * (256 / max)" est une constante qui devrait être évalué un seule
fois (je ne laisserais pas l'optim au bon vouloir du compilo).


Pour les valeurs considérées ici (avec max valant 10 ou 26), le nombre
moyen d'évaluation de la boucle sera de 1.094 (pour max = 26) ou de
1.024 (pour max = 10). Autrement dit, le surcoût maximal de la deuxième
division est de 9.4%, ce qui est assez misérable, en fait.

Si néanmoins on s'inquiète de vitesse dans ce cas, alors il faut ne pas
faire la division du tout, ce qui se fait en spécialisant la fonction
randval() : randval10() pour le cas max = 10, randval26() pour le cas
max = 26, et constante inscrite en dur dans le programme (respectivement
250 et 234).

Mais il est fort douteux que cela ait une quelconque influence détectable
ici ; mieux vaut alors se contenter du code compact et lisible.


--Thomas Pornin

1 2