Un bon mot de passe doit garantir l'accès aux données de votre site, qu'elles soient stockées dans une base, ou que l'interface de mise à jour soit protégée par une demande d'authentification. Ce mot de passe doit être le plus difficile à deviner pour un attaquant et le plus facile à mémoriser pour vous. Ces deux obligations semblent contradictoires, mais quelques astuces peuvent aider à construire des mots de passe de cette sorte.

Un mot de passe doit respecter certaines règles de complexité pour éviter qu'il ne soit découvert trop facilement. La compléxité d'un mot de passe est définie par sa longueur et par le nombre de valeurs différentes qu'un caractère peut prendre.

Utilisez plusieurs types de caractères :

- des caractères minuscules (abcde.....z)
- des caractères majuscules (ABCDE.....Z)
- des nombres (1234567890)
- des caractères "spéciaux" et accentués (par exemple !@#$%^&*()?èçàù)

Exemple : si votre mot de passe comporte 5 caractères :

- 11 881 376 possibilités avec des minuscules
- 380 204 031 possibilités avec des majuscules et minuscules
- 2 406 784 457 possibilités avec des majuscules, des minsucules et 25 caractères spéciaux ou accentués.

### Exercice : mot de passe par remplacement

Une méthode de mémorisation des mots de passe consiste à remplacer un caractère minuscule par un caractère spécial, le même caractère en majuscule ou un nombre.

Quelques substitutions classiques

Avec cette méthode,
François devient Fr@nç01$,
motdepasse devient M07DéP@553
et secret devient $3CrE7

s
  est remplacé par S ou 5 ou $
i
  est remplacé par I ou 1 ou !
a
  est remplacé par A ou à ou @
t
  est remplacé par T ou 7
e
  est remplacé par E ou 3 ou é
g
  est remplacé par G ou 6 ou 9
o
  est remplacé par O ou 0
b
  est remplacé par B ou 8

Ecrivez la fonction remplacerCaracteres qui implémente la mémorisation par remplacement de caractères. Cette fonction accepte comme paramètre la chaîne de caractères à transformer. Le traitement de substitution est constitué de 3 étapes.

1 - Certains caractères accentuables sont accentués de la façon suivante :

a
  par à
e
  par é

c
  par ç
u
  par ù

2 - Les caractères substituables sont remplacés de la façon suivante :

s
  par $ ou 5
i
  par ! ou 1
t
  par + ou 7

g
  par ? ou 9
o
  par . ou 0

On remplace une fois par un caractère spécial, une fois par un chiffre.

3 - On remplace les minuscules restantes (une sur deux) par la majuscule correspondante.

La fonction remplacerCaracteres renvoie la chaîne avec les caractères transformés.

Exemples

Chaîne | Etape 1 | Etape 2 | Etape 3
François | frànçois | frànç.1$ | FràNç.1$
secret | séçrét | $éçré7 | $éçRé7
motdepasse | motdépàssé | m.7dépà$5é | M.7déPà$5é

Remarque : si la chaîne contient des espaces, ils doivent être supprimés.

Une solution possible

Exercice : création de mot de passe par remplacement
<?php require('bib_fonctions.php'); function remplacerCaracteres($chaine) { $new = ''; // Contient la nouvelle chaîne $accents = 'àéçù'; // caractères accentués $aChanger = 'sitgo'; // caractères à remplacer $spex = '$!+?.'; // caractères spéciaux correspondants $chif = '51790'; // chiffres correspondants $spe = TRUE; // remplacement spécial (ou chiffre) $maj = TRUE; // remplacement par une majuscule $chaine = strtolower($chaine); $chaine = str_replace(' ','', $chaine); $t = array('a'=>'à', 'e'=>'é', 'c'=>'ç','u'=>'ù'); $chaine = strtr($chaine, $t); // Examine la chaîne caractère par caractère for ($i = 0, $iMax = strlen($chaine); $i < $iMax; $i++) { $car = $chaine{$i}; // Si caractère accentué, on ne fait rien if (strpos($accents, $car) !== FALSE) { $new .= $car; continue; } // Remplacement par un spécial ou par un chiffre if (strpos($aChanger, $car) !== FALSE) { $new .= strtr($car, $aChanger, ($spe) ? $spex : $chif); $spe = !$spe; continue; } // Remplacement majuscule $new .= ($maj) ? strtoupper($car) : $car; $maj = !$maj; } return $new; } htmlDebut('Mot de passe par remplacement'); tester('remplacerCaracteres', 'François', 'FràNç.1$'); tester('remplacerCaracteres', 'secret', '$éçRé7'); tester('remplacerCaracteres', 'motdepasse', 'M.7déPà$5é'); htmlFin(); ?>

### Exercice : mots de passe par mélange

La méthode de mémorisation de mots de passe par mélange consiste à prendre 2 ou plusieurs mots et à les mélanger suivant un certain ordre. Par exemple on prend le 1er caractère du premier mot, le 2eme caractère du second mot, le 3eme caractère du premier mot, le 4eme caractère du second mot, etc. A la place du deuxième mot, on peut avoir aussi une suite de nombre (par exemple artihmétique, géométrique, nombre premiers, PI, suite de Fibonacci, etc).

Exemples

Premier mot | Deuxième mot | Résultat
François | Piat | FPriaantçois
Piat | doubler les nombres | P1i2a4t8
secret | login | sleocgrient

Ecrivez la fonction melangerCaracteres qui implémente la mémorisation par mélange de mots ou de modèles. Cette fonction accepte 2 paramètres :

- la chaîne de caractère à transformer
- la chaîne de caractères à mélanger.

Les espaces éventuels dans les chaînes doivent être enlevés.

Le 1er paramètre est la 1ere chaîne à transformer.

Si le deuxième paramètre est une chaîne de caractères (chaîne à mélanger), le traitement consiste à concaténer la 1ere lettre de la chaîne à transformer, puis la 1ere lettre de la chaîne à mélanger, puis la 2eme lettre de la chaîne à transformer, puis la 2eme lettre de la chaîne à mélanger, puis la 3eme lettre de la chaîne à transformer, puis la 3eme lettre de la chaîne à mélanger, etc..

Si le deuxième paramètre est un nombre positif, le traitement consiste à prendre le 1er caractère de la chaîne à tranformer, le nombre, le 2eme caractère de la chaîne, le nombre + 1, le 3eme caractère de la chaîne, le nombre + 2, etc.

Si le deuxième paramètre est un nombre négatif, les caractères de la chaîne à transformer sont répétés autant de > fois que le nombre, en commençant par la fin de cette chaîne (la chaîne est inversée).

La fonction melangerCaracteres renvoie la chaîne avec les caractères transformés.

Exemples

Chaîne à transformer | Chaîne à mélanger | Résultat
François | Piat | FPriaantçois
login | secret | lsoegcirnet
motde | passe | mpoatsdsee
Piat | 3 | P3i4a5t6
login | -2 | nniiggooll

Une solution possible

Exercice : création de mot de passe par mélange
<?php require('bib_fonctions.php'); function melangerCaracteres($chaine, $melange) { $chaine = str_replace(' ', '', $chaine); $iMaxC = strlen($chaine); $new = ''; // Mélange de chaînes if (is_string($melange)) { $melange = str_replace(' ', '', $melange); $iMaxM= strlen($melange); // Boucle de mélange des caractères for ($i = 0; $i < $iMaxC && $i < $iMaxM; $i++) { $new .= $chaine{$i}; $new .= $melange{$i}; } // Si il reste des caractères dans une // ou l'autre des chaînes, on les ajoute tel que. $new .= substr($chaine, $i); $new .= substr($melange, $i); return $new; // RETURN : fin mélange chaînes } // Traitement mélange négatif if (is_int($melange) && $melange < 0) { // On retourne la chaîne $chaine = strrev($chaine); $melange *= -1; // On multiplie les caractères for ($i = 0; $i < $iMaxC; $i++) { $car = $chaine{$i}; $new .= str_repeat($car, $melange); } return $new; // RETURN : fin mélange négatif } // Traitement mélange positif if (is_int($melange) && $melange > 0) { for ($i = 0; $i < $iMaxC; $i++, $melange++) { $new .= $chaine{$i}.$melange; } return $new; // RETURN : fin mélange positif } // Si on est ici c'est que le 2éme paramètre n'était pas // bon. On retourne une chaîne vide. return $new; } htmlDebut('Mot de passe par mélange'); tester('melangerCaracteres', 'François', 'Piat', 'FPriaantçois'); tester('melangerCaracteres', 'login', 'secret', 'lsoegcirnet'); tester('melangerCaracteres', 'motde', 'passe', 'mpoatsdsee'); tester('melangerCaracteres', 'Piat', 3, 'P3i4a5t6'); tester('melangerCaracteres', 'login', -2, 'nniiggooll'); htmlFin(); ?>

### Exercice : mots de passe à partir d'une phrase

La méthode de mémorisation de mot de passe à partir d'une phrase consiste à prendre une phrase (ou une partie de phrase) et à ne garder que certains caractères (par exemple le premier caractère de chaque mot, ou le 2éme, ou le dernier, etc).

Exemples

Phrase | Méthode | Résultat
12 avenue de mon adresse | 1er caractère de chaque mot | 1adma
que la force soit avec toi | 2eme caractère de chaque mot | uaoovo
mot de passe secret | derniere caractère et premier caractère de chaque mot | tsepedtm

Ecrivez la fonction melangerPhrase qui implémente la mémorisation à partir d'une phrase. Cette fonction accepte 2 paramètres :

- la phrase à transformer sous la forme d'une chaîne de caractères
- un type de mélange :
  - 1er caractère de chaque mot
  - dernier et premier caractères de chaque mot
  - 1er caractère du premier mot, 2eme caractère du 2eme mot, 3eme caractère du 3eme mot, etc.

Le traitement des mots de la phrase devra être fait avec une autre méthode que la fonction PHP explode() générant un tableau.

Exemples

Phrase | Type | Résultat
que la force soit avec toi | 1 | qlfsat
mot de passe secret | 2 | tmedepts
1 rue des Quatre Chemins | 3 | 1usti

La fonction melangerPhrase renvoie la chaîne avec les caractères transformés.

Une solution possible

Exercice : création de mot de passe à partir d'une phrase
<?php require('bib_fonctions.php'); function melangerPhrase($txt, $type) { $txt = trim($txt); $new = ''; // 1er caractère de chaque mot if ($type === 1) { $new = $txt{0}; for ($i = 1, $iMax = strlen($txt); $i < $iMax; $i++) { if ($txt{$i} == ' ') { $i++; $new .= $txt{$i}; } } return $new; // RETURN : fin type 1 } // dernier et 1er caractère de chaque mot if ($type === 2) { $mot = ''; $txt .= ' '; for ($i = 0, $iMax = strlen($txt); $i < $iMax; $i++) { if ($txt{$i} == ' ') { $new .= substr($mot, -1); $new .= $mot{0}; $mot = ''; $i ++; } $mot .= $txt{$i}; } return $new; // RETURN : fin type 2 } // 1er caractère 1er mot, 2eme du 2eme mot ... if ($type === 3) { $txt = ' '.$txt; $next = 0; for ($i = 0, $iMax = strlen($txt); $i < $iMax; $i++) { if ($txt{$i} == ' ') { $next ++; $new .= $txt{$i + $next}; } } return $new; // RETURN : fin type 3 } // Si on est ici c'est que le 2éme paramètre n'était pas // bon. On retourne une chaîne vide. return $new; } htmlDebut('Mot de passe par mélange'); tester('melangerPhrase', 'que la force soit avec toi', 1, 'qlfsat'); tester('melangerPhrase', 'mot de passe secret', 2, 'tmedepts'); tester('melangerPhrase', '1 rue des Quatre Chemins', 3, '1usti'); htmlFin(); ?>