Je bosse en ce moment sur une petite API pour un usage ludique au bureau (j’expliquerais ce que c’est une prochaine fois), et ça m’a inspiré une courte note sur comment générer un token sécurisé en perl.
Pour générer des chaînes de caractères en perl, il existe l’excellent String::Random. Il combine plusieurs méthodes mais elles peuvent s’avérer pauvres pour générer un token, car celui-ci doit :
être une suite aléatoire de caractères alphanumériques
avoir un pattern dynamique
Avoir un pattern dynamique, ça veut dire que la séquence ne doit pas se répéter même si les caractères sont aléatoires, par exemple:
Majuscule-minuscule-chiffre-minucule...
C’est un pattern statique : les caractères auront beau être aléatoires, la suite restera la même. Ce serait donc mieux si le pattern était également aléatoire.
Pour répondre à cette problématique, j’ai combiné la méthode randpattern à la méthode randregex.
randpattern renvoie une chaîne de caractère définie par un pattern respectant :
c : tout caractère latin en minuscule
C : tout caractère latin en majuscule
n : tout chiffre
. : n’importe lequel des trois précédents
Par exemple :
my $s = String::Random->new();
$s->randpattern("cCn"); # renvoie jR4, sK1, pF3...
Utiliser seulement randpattern revient à utiliser un pattern statique puisqu’écrit en dur.
randregex renvoie une suite de caractère aléatoire qui sont choisis dans la regex donnée en argument. Par exemple :
my $s = String::Random->new();
$s->randregex('\d\w\d{5}'); # renvoie 5Z61258, 8R46964, 6l14705...
Les lettres pouvant être majuscules ou minuscules, c’est presque aléatoire. Mais en combinant les deux ainsi :
my $s = String::Random->new();
$s->randpattern($s->randregex('[CcnCn]{20}'));
J’obtiens donc une suite réelement aléatoire de 20 caractères, puisque pris aléatoirement dans l’ensemble CcnCn, et utilisés ensuite par randpattern pour mixer ce pattern afin de cracher le token voulu :
S5eYwWj30MWXEZ4FmWmr
1BW93BAh9ueCsYIY2js7
vW9ytOPVaG571BK40Ove
J491kSRwn9Wh3ZoRZS9J
0LQoVwF512GR4mcLAZ86
Cela permet des suites aléatoires et dont le pattern est dynamique : par exemple, le premier caractère est parfois un chiffre, parfois une majuscule, parfois une minuscule.