Méthode d'utilisation d'openssl en shell pour cryptage massif de mots de passe
Bonjour,
Ici, le but est d'avoir par exemple 10 millions de mots de passe à crypter avec openssl dont la commande d'exemple pour un seul mot de passe serait:
Code:
1 2
| echo -n mot_de_passe | openssl enc -aes128 -a -iv d80667e915403ebf5abc787971e6edcd -K 9c2751a06ed8802cb11700498f09d5bd
E01+Iy+idNeTbXNTyMmcSw== |
Pour les 10 millions de mots de passe, la méthode "naïve" serait par exemple:
Code:
1 2 3 4
| while read mdp
do
echo -n $mdp | openssl enc -aes128 -a -iv d80667e915403ebf5abc787971e6edcd -K 9c2751a06ed8802cb11700498f09d5bd
done <mdp.txt >mdp.enc1 |
ici, cela fonctionne, mais voyons la durée pour par exemple 1000 mots de passe:
Code:
1 2 3 4 5 6 7
| $ wc -l mdp.txt
1000 mdp.txt
$ time while read mdp; do echo -n $mdp | openssl enc -aes128 -a -iv d80667e915403ebf5abc787971e6edcd -K 9c2751a06ed8802cb11700498f09d5bd; done <mdp.txt >mdp.enc1
real 0m9.924s
user 0m4.356s
sys 0m1.172s |
On est environ à 9 secondes (je suis gentil) pour 1000 mots de passe, comme ce genre d'algo est linéaire, on peut extrapoler, et dire qu'il faudrait 90 secondes pour 10.000, 900 secondes pour 100.000, 9000 secondes pour 1.000.000 et 90.000 secondes (25 heures) pour nos 10 millions.
Bon, là, on est sur des temps un peu long, il serait bien de pouvoir réduire ce temps...
Personnellement, après quelques recherches infructueuse sur le net, j'ai utilisé une autre forme d'écriture d'openssl qui m'a permit de gagner du temps.
Le code est le suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| mkfifo in0 in1 out0 out1
rm -f mdp.enc
openssl < <(
j=1
while read mdp
do
x=$(( j++ % 2 ))
echo "enc -aes128 -a -iv d80667e915403ebf5abc787971e6edcd -K 9c2751a06ed8802cb11700498f09d5bd -in in$x -out out$x"
printf "%s" "$mdp" >in$x
read res <out$x
echo $res >>mdp.enc
done <mdp.txt
) >/dev/null
rm -f in0 in1 out0 out1 |
Ce qui donne pour 1000 mot de passe à crypter:
Code:
1 2 3 4 5
| time { mkfifo in0 in1 out0 out1 ; rm -f mdp.enc ; openssl < <(j=1;while read mdp; do x=$(( j++ % 2 )); echo "enc -aes128 -a -iv d80667e915403ebf5abc787971e6edcd -K 9c2751a06ed8802cb11700498f09d5bd -in in$x -out out$x" ; printf "%s" "$mdp" >in$x ; read res <out$x ; echo $res >>mdp.enc ; done <mdp.txt ) >/dev/null ; rm -f in0 in1 out0 out1 ; }
real 0m0.485s
user 0m0.064s
sys 0m0.068s |
Comme on peut le voir, si on extrapole, on passe de 90.000 secondes (25 heures) à 5000 secondes ( ~ 1 heure 30 minutes).
Ce gain n'est dû qu'a une chose, la version naïve relance la commande openssl autant de fois qu'il y a de mots de passe à traiter tandis que la deuxième version ne lance qu'une seule fois openssl et lui dit de crypter autant de fois qu'il y a de mots de passe à traiter.