Validation de mot de passe

Nous utilisons tous des mots de passe pour nous connecter à différentes applications sur internet.

Choisir un bon mot de passe n'est pas si simple, celui-ci doit respecter certaines règles d'améliorer sa sécurité. On propose dans cet exercices certaines règles de validation des mots de passe.

Les règles présentées ici sont trop simples !

Les règles utilisées dans l'exercice sont simplifiées afin de ne pas compliquer l'algorithme.

Elles ne garantissent pas forcément que le mot de passe généré sera « fort ».

On rappelle à ce titre qu'un mot de passe fort :

  • doit compter au minimum 14 caractères,
  • doit éviter d'utiliser des mots courants du dictionnaire,
  • doit éviter d'utiliser de noms de personnes ou de marques,
  • ne doit pas contenir de dates de naissances ni de codes postaux,
  • ne doit être utilisé que pour une seule application,
  • doit, de façon générale, être facile à mémoriser pour vous mais compliqué à deviner pour une autre personne.

Ces règles ne sont toutefois pas exhaustives.

Cette illustration tirée du webcomic xkcd propose une méthode de construction de mot de passe « forts ».

On considère dans la suite qu'un mot de passe est valide s'il contient :

  • au minimum 14 caractères (inclus),

  • au moins une lettre majuscule,

  • au moins une lettre minuscule,

  • au moins un chiffre,

  • au moins un caractère spécial parmi ",;:!?./§%*$£&#{}()[]-_@" (sans les guillemets).

On demande donc d'écrire une fonction valide qui prend en paramètre une chaîne de caractères mdp et renvoie True si cette chaîne est un mot de passe valide, False dans le cas contraire.

On garantit que les chaînes de caractères mdp passées en argument ne contiennent que des caractères alphanumériques et des caractères spéciaux.

Aides sur les chaînes de caractères en Python

Si chaine est une chaîne de caractères :

  • chaine.isupper() renvoie True si chaine ne contient que des caractères en majuscule, False dans le cas contraire,
  • chaine.islower() renvoie True si chaine ne contient que des caractères en minuscule, False dans le cas contraire,
  • chaine.isnumeric() renvoie True si chaine ne contient que des chiffres, False dans le cas contraire.

Ces différentes méthodes sont utilisables dans le cas où chaine ne contient qu'un seul caractère.

Exemples
>>> mdp = "X5j13$#eCM1cG@Kdce246gs%mFs#3tv6"  # Mot de passe valide
>>> valide(mdp)
True
>>> mdp = "X5j13$#eCM"  # Trop court
>>> valide(mdp)
False
>>> mdp = "5j13$#e1c@dce246gs%ms#3tv6"  # Pas de majuscule
>>> valide(mdp)
False
>>> mdp = "X513$#CM1G@K246%F#36"  # Pas de minuscule
>>> valide(mdp)
False
>>> mdp = "X5j13eCM1cGKdce246gsmFs3tv6"  # Pas de caractère spécial
>>> valide(mdp)
False

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013b?q$,9v@i3o_;}jlpwT!f( g£0]6-)2As18e%n4E[m5tC§Phk:c.a=ryXFSI*u/7{Ud050?0K0S0#0j0q0H0x0Z0q0#0H0H0$010S0j0r010406050H0.0Q0Q0#0%0(040+0l0q0.170l0M050/1e1g1i1k1c0r04051A1t1D0/1A1c0?0j0h0 1113150W0j0y0W0q1R0W0S1a050`0b0q0K1M1214011Q1S1U1S0S1!1$1Y0S0%1B0S0W0 1n0H0r0#0M150F011(1O010v0|0K0M0#0Q0K1Y1~20251*281$2b2d1a0a0x0V0%0l0r0l0H0j1q0M0x0^1|0%0%0K0Z2y1t2g0M1B0/1`2L1@1_1^1Z0?2i151U0M2a2v1Y1J1L101)2V0j2X0M0l2#1Y0r2E1B2J2L2?1d1 2z2%262,0%1h0q1a0x0I2I2`1b2_2h2|1*2~30320F3520372J2U013c0#31040x0k3g2K1c3j3a153m3o0x0N3s3i2`3k3y320R3C3u3E3w3l0l2 3n320C3J382{1N3b3O3d3p0:3T3v3W3x3Y3Q3p0J3$3L3(3N3P3z0g3.393:3G040I0A3^3V2(3;3Z0I341u363K3_413{0I3f463h48402}3*3o0I3r4e3t3U3F4j1a0I3B4n3D494i3=4s3I4v4g4q4z3|3S4C4p3M4b3#4I3%4a4r3|3-4N3/4P4F0I3@4T4x3X4F0F3~4v1E2;1t2#2O0?1_2T3M0Z2-2e1B4-1C4+2^4)4?0^2=4U2}1a0+0V0O0T0,0G0=0)3C0x4J3:0l1a0$5d5f410H2304020d0.0l0S0n0f0n0Y0u0c0!0/0U0L0-0e0z022c0r0n033C5l262w1a0;0o5N4O5P5o0w0E0P0B0D0m0i5q5s5u3J064D3M0X1a0^0v5U521*0s325@4!3x0v1a0h3n0j0^5|4h1*19040w653F1a0Q0?0r6b3M680E0Y3J0x6n5e5V1*5:040j5?4v6p5^3x0b1a2l6h3:686a4)6q3x6d6f6D416j5k6I015h5p0q5+6w5O1*0Q0j4s4u2^6Q686l4C6o6,6x5}016s2E0S0.0%1s6W6Q0X0Z1a0*3n0H0K6m6o6X6J046Z0M0.0H0Z0.1$6P6y6R5i7f6/6|6~70726+746Q0M6d0#0p7a7c7e6`7g6S5j7z7k6}046 0}7o2?066,753l1a0Z1Q0v0v2E7j66157B7V3k7l7G7n736n7N7s041~2F0j3n7Z3M7Y7D7W6:7F7H717(6.7^6s0v3O7;3`7P83410l5`6t6_2?7~6c776L6H7g6)7}7M6{1a6u8653040Z6M266S0!8t3b8n1e0r0r0K0%8x156F6k8k6-7)7r7t7v7b7d7J368d7=7i7@7!7F0t0%0.8R4f8K8L7g6s0K1U6v8c7*858h6/8v8F7O6t0H0q888D8^8H6*7K8(6-8:772*7w8Q8p1*7?8/6{8Y8!8$3t937N8+8-9a768s8=7^8@9q8e0j0H792d0%0j9p6%8i1a5Y9147938l7g7+7Q6u7T9h3p7N9c8S9k9f8#8J8)7k1a8,8o8W4K8;9d7A892*9n8_5557595b8 1a9G8%9I9Y7^7+7-0Z7/0q9.9S3h8T3:7#8Z9W7p9|7!1a6=6@8b9T8M96798P7y9*8?89200?9.7+1h8O7x9Pa687aq0Mas9%848r7R9Oa3aBaDao9}1a9 a13T0/4 0K2L2:aU4,1K4.2O2R2M0#1#aX0/4-1ca+0_0{0}04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013b?q$,9v@i3o_;}jlpwT!f( g£0]6-)2As18e%n4E[m5tC§Phk:c.a=ryXFSI*u/7{Ud050?0K0S0#0j0q0H0x0Z0q0#0H0H0$010S0j0r010406050H0.0Q0Q0#0%0(040+0l0q0.170l0M050/1e1g1i1k1c0r04051A1t1D0/1A1c0?0j0h0 1113150W0j0y0W0q1R0W0S1a050`0b0q0K1M1214011Q1S1U1S0S1!1$1Y0S0%1B0S0W0 1n0H0r0#0M150F011(1O010v0|0K0M0#0Q0K1Y1~20251*281$2b2d1a0a0x0V0%0l0r0l0H0j1q0M0x0^1|0%0%0K0Z2y1t2g0M1B0/1`2L1@1_1^1Z0?2i151U0M2a2v1Y1J1L101)2V0j2X0M0l2#1Y0r2E1B2J2L2?1d1 2z2%262,0%1h0q1a0x0I2I2`1b2_2h2|1*2~30320F3520372J2U013c0#31040x0k3g2K1c3j3a153m3o0x0N3s3i2`3k3y320R3C3u3E3w3l0l2 3n320C3J382{1N3b3O3d3p0:3T3v3W3x3Y3Q3p0J3$3L3(3N3P3z0g3.393:3G040I0A3^3V2(3;3Z0I341u363K3_413{0I3f463h48402}3*3o0I3r4e3t3U3F4j1a0I3B4n3D494i3=4s3I4v4g4q4z3|3S4C4p3M4b3#4I3%4a4r3|3-4N3/4P4F0I3@4T4x3X4F0F3~4v1E2;1t2#2O0?1_2T3M0Z2-2e1B4-1C4+2^4)4?0^2=4U2}1a0+0V0O0T0,0G0=0)3C0x4J3:0l1a0$5d5f410H2304020d0.0l0S0n0f0n0Y0u0c0!0/0U0L0-0e0z022c0r0n033C5l262w1a0;0o5N4O5P5o0w0E0P0B0D0m0i5q5s5u3J064D3M0X1a0^0v5U521*0s325@4!3x0v1a0h3n0j0^5|4h1*19040w653F1a0Q0?0r6b3M680E0Y3J0x6n5e5V1*5:040j5?4v6p5^3x0b1a2l6h3:686a4)6q3x6d6f6D416j5k6I015h5p0q5+6w5O1*0Q0j4s4u2^6Q686l4C6o6,6x5}016s2E0S0.0%1s6W6Q0X0Z1a0*3n0H0K6m6o6X6J046Z0M0.0H0Z0.1$6P6y6R5i7f6/6|6~70726+746Q0M6d0#0p7a7c7e6`7g6S5j7z7k6}046 0}7o2?066,753l1a0Z1Q0v0v2E7j66157B7V3k7l7G7n736n7N7s041~2F0j3n7Z3M7Y7D7W6:7F7H717(6.7^6s0v3O7;3`7P83410l5`6t6_2?7~6c776L6H7g6)7}7M6{1a6u8653040Z6M266S0!8t3b8n1e0r0r0K0%8x156F6k8k6-7)7r7t7v7b7d7J368d7=7i7@7!7F0t0%0.8R4f8K8L7g6s0K1U6v8c7*858h6/8v8F7O6t0H0q888D8^8H6*7K8(6-8:772*7w8Q8p1*7?8/6{8Y8!8$3t937N8+8-9a768s8=7^8@9q8e0j0H792d0%0j9p6%8i1a5Y9147938l7g7+7Q6u7T9h3p7N9c8S9k9f8#8J8)7k1a8,8o8W4K8;9d7A892*9n8_5557595b8 1a9G8%9I9Y7^7+7-0Z7/0q9.9S3h8T3:7#8Z9W7p9|7!1a6=6@8b9T8M96798P7y9*8?89200?9.7+1h8O7x9Pa687aq0Mas9%848r7R9Oa3aBaDao9}1a9 a13T0/4 0K2L2:aU4,1K4.2O2R2M0#1#aX0/4-1ca+0_0{0}04.