# [TIP] Génération aléatoire de mots de passe

## anigel

Bonsoir,

Ceux d'entre vous qui utilisent des serveurs Linux avec plusieurs utilisateurs ont probablement déjà été confronté au problème de la génération aléatoire de mots de passe. Il existe pas mal de solutions, plus ou moins pratiques, mais aucune n'avait répondu à mon "cahier des charges" :

générer des trucs d'une longueur raisonnable (le plus souvent, c'est paramétrable) : ni trop, ni trop peu.

comporter des caractères vraiment aléatoires, et pas un simple random sur l'alphabet français.

assez rapide pour générer 1000 mots de passe en moins de 30 minutes (là, j'ai perdu apg, que j'utilisais jusque-là).

et surtout, être capable de me générer la version "en clair", mais aussi la version "cryptée" du mot de passe (là, j'en ai pas encore trouvé un seul).

Alors je me suis mis à réfléchir, et me suis penché sur la suite openssl. C'est installé de base sur n'importe quel linux, donc pas de souci à ce niveau-là. Et il se trouve que cela a parfaitement répondu à mes attentes ! Voici donc les 2 lignes de commandes magiques à employer dans vos scripts bash / perl / tricot_jersey  :Wink: .

```
MY_PASSWORD=`openssl rand -base64 6`

MY_CRYPTED_PASSWORD=`echo $MY_PASSWORD | openssl passwd -stdin`
```

Ces commandes magiques vont vous créer, à la vitesse de l'éclair, des couples password / crypted password, que vous pouvez directement réinjecter dans le système / l'utilisateur. Pour le système :

```
usermod -p $MY_CRYPTED_PASSWORD $USER
```

Pour l'utilisateur : n'importe quel client e-mail, envoyez-lui son login, avec la valeur contenue dans $MY_PASSWORD  :Wink: .

Voilà, astuce courte, mais bien pratique.

----------

## voltairien

Et la commande crypt (du package app-crypt/cli-crypt) Elle irait pas encore plus rapidement ? :

```
MY_PASSWORD=`openssl rand -base64 6`

MY_CRYPTED_PASSWORD=`/usr/bin/crypt $MY_PASSWORD`
```

----------

## anigel

Oui et non. D'une part, crypt ne comporte pas de fonction de génération de mot de passe aléatoire (il faut donc malgré tout avoir recours à un logiciel tiers), et d'autre part openssl dispose de tout un tas d'algos de cryptage (la série des MD, DES, et j'en passe).

Ca peut donc être facilement adapté pour une base MySQL par exemple, avec cryptage MD5.

----------

## voltairien

Tu as raison pour openssl, c'est grace à lui qu'on va générer le mot de passe.

Pour la rapidité d'exécution, par contre : 

```
port-voltairien tmp # time for ((I=0;I<=10;I++)); do /tmp/crypt_anigel; done

SlhLeLHN

Lc2CQGOw3PQAw

5BNck4L1

3/Y8NAJvAnXZ.

UY6CsxX1

/d03Yk1BL0P62

ej7bYaga

7xk6hsO6Y2ic2

Jr2miXP/

lHHQvVGRCmyZo

TDEkbj3B

V5qTA8rDKuG7M

kjEyQ+/T

FHWxl8ndOZ9BA

aHRR8NzL

T96oi/TzuSVJQ

3J+GRmbK

zFJaUKPSj4J5E

d/8qOp3f

f2CTt.uJEaWOM

ghvHKNrJ

PVpxUoZJv5lcA

real    0m0.222s

user    0m0.116s

sys     0m0.025s

port-voltairien tmp # time for ((I=0;I<=10;I++)); do /tmp/crypt_voltairien; done

+ZmtJYOq

2F15Rkw5FlGTw

3dJ10YJN

8LEdWcfkQOdxA

4auJEv9P

jwHSjipueR/nk

KleLLjVM

Kn1oaKuxn7JHQ

RrSXQYK6

jgPf6ijdvJs8g

x5dUhlaT

hr8EeqaOEa0yw

kHLXX+u7

Av8FlD1Yqy6wQ

gH0OFdft

ekcMfS4..eO3k

Q0qnW/nd

JyYKx46TETA7A

fbECgxO8

eFhwdY8x.BiSc

W/4ljfr2

P4Fo.6UACaI2o

real    0m0.172s

user    0m0.069s

sys     0m0.022s

```

crypt est donc plus rapide....

Ca m'intéresse bien ces scripts aussi pour générer des comptes.

V.

----------

## anigel

Je n'ai pas réellement fait de bench. La seule chose dont je sois certain, c'est que cette solution est beaucoup plus rapide que celle que j'utilisais auparavant (apg), en plus d'être plus souple. J'ai généré un peu plus de 2000 mots de passe en moins de 4 minutes  :Arrow:  ça me suffit  :Wink: .

Il faut noter aussi que les perfs d'openssl sont différentes selon les options compilées dans la noyau, nottament en ce qui concerne le support du hardware random number generation support.

----------

## scout

[mode pub pour ruby]

Voilà moi je vais vous générer 10**40 mots de passe en une seconde, le tout c'est d'envoyer les mails suffisament rapidement aux gens.

Bon déja il faut qu'on voit ce que openssl utilise comme caractères pour faire des mots de passe

```
( repeat 100 openssl rand -base64 100 ) | ruby -e 'print $<.read.scan(/./m).uniq.sort; puts'

+/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
```

bon donc ce sont les chiffres, l'alphabet, +, / et =

alors assez parlé, voilà du code:

```
#!/usr/bin/ruby -w

# 1er  argument - par défaut 1 : nb de mot des passe à générer

# 2eme argument - par défaut 6 : longeur minimale des mots de passe

# 3eme argument - par défaut 8 : longeur maximale des mots de passe

LONGEURMIN=(ARGV[1] || 6).to_i

LONGEURMAX=(ARGV[2] || 8).to_i

srand((Time.now.to_f*10**5).to_i % 10**6)

base=["+","/","=","0".."9","a".."z","A".."Z"].collect do |range|

    range.to_a

end.flatten

(ARGV[0] || 1).to_i.times do

    #génération d'un mot de passe

    (LONGEURMIN+rand(LONGEURMAX-LONGEURMIN+1)).times do

        print base[rand(base.length)]

    end

    puts

end
```

au départ j'avais même une version crade en une ligne ...

bon voilà:

```
time ruby ~/ruby/passgen.rb 10000 | openssl passwd -stdin >| /dev/null

ruby ~/ruby/passgen.rb 10000  0,20s user 0,00s system 30% cpu 0,669 total

openssl passwd -stdin >| /dev/null  0,22s user 0,03s system 36% cpu 0,688 total
```

Bon, là j'écris le serveur de mail en C qui arrive à envoyer les mails à la même vitesse, à savoir les 10000 mails en 0.6 secondes.  :Mr. Green: 

[/mode pub pour ruby]

[EDIT]oui, je sais, j'ai complètement craqué  :Smile: 

[EDIT2] Merci à anigel pour le howto

----------

## anigel

Lol, je ne pensais pas lancer un concours  :Laughing:  !

Qui s'y colle en java   :Twisted Evil:  ?

----------

## boozo

'alute

ce n'est pas stricto sensus réellement aléatoire ni ultra sécurisé mais j'avais trouvé ce tip sympatoche dans une news gentoo de 2003 et qui pourrait-être utile à d'autres   :Wink: 

 *Quote:*   

> 9. Tips and Tricks
> 
> A Quick and Easy Password Generator
> 
> This week's tip shows you how to quickly generate a list of passwords using /dev/urandom, and uuencode.
> ...

 

Dans la même optique, il existe passook qui est un générateur de password human-readable  vraiment simple d'utilisation dans portage... très commode pour les utilsateurs d'un réseau (login/mail/etc.) récalcitrant à l'utilisation de password efficaces   :Wink: 

(qui à dit maman ?  :Mr. Green: )

----------

## netfab

Dans portage, il y a aussi :

 *Quote:*   

> * app-admin/makepasswd
> 
>      Available versions:  1.10
> 
>      Installed:           1.10
> ...

 

Niveau aléatoire, je ne sais pas trop ce que çà donne, mais pour l'instant, çà me suffit.

```
$ time makepasswd --chars 10 --count 2000 > fich

real    0m0.217s

user    0m0.147s

sys     0m0.010s

```

----------

