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

.128013s3_8£ufvIy n7aS1me(P24C:jtwi§][hE*@)6o;bcdUg?/XT0lAp!.rF-,$}=k%95{050Q0s0A0o0C0Y0b0l0P0Y0o0b0b0-010A0C0!010406050b0g0r0r0o0%0k040p0M0Y0g160M0m050U1d1f1h1j1b0!041s1z051C0U1C1E1z1b0Q0C0i0~1012140G0C0S0G0Y1S0G0A19050_0O0Y0s1N1113011R1T1V1T0A1#1%1Z0A0O0M0Q1j1!0%1A0A0G0~1m0b0!0o0m140v011)1P010h0{0s0m0o0r0s1Z24262b1+2e1%2h2j190a0l0u0%0M0!0M0b0C1p0m0l0@220%0%0s0P2E1s2m0m1A0U202R0A1~1}1 0Q2o141V0m2g2B1Z1K1M0 1*2#0C2%0m1`1L1Z0!2K1A2P2R2|1c252F2-2c2=0%1g0Y190l0q2O301a2 2n321+3436380v3b263d2P2!013i0o37040l0c3m2Q1b3p3g143s3u0l0w3y3o303q3E380;3I3A3K3C3r0M353t380L3P3e311O3h3U3j3v0n3Z3B3$3D3(3W3v0e3,3R3.3T3V3F0:3@3f3_3M040q0X3~3#2.3`3)0q3a1t3c3Q3 47410q3l4c3n4e46333:3u0q3x4k3z3!3L4p190q3H4t3J4f4o3{4y3O4B4m4w4F423Y4I4v3S4h3+4O3-4g4x423?4T3^4V4L0q3}4Z4D3%4L0v444B1B2`1s2+2U0Q2Y3q0P1`2k1A4?1D4;2~4/4{0@2{4!33190p0u0H0x0j0Z0R0V3I0l4P3_0M190-5i5k470b2904010*0N0y0#0T0$0U0D0/0I0+0f022i0!0N033I5q2c2C190=0,5N4U5P5t0t0K0F0E0)0d0J013P064J3S0.190@0h5U571+0B385=4*3D0h190i3t0C0@5`4n1+18040t633L190r0Q0!693S660K0y3P0l6l5j5V1+5.040C5;4B6n5?3D0O192r6f3_66684/6o3D6b6d6B476h5p6G015m04020Y0A0N6N6w010r0C4y4A2~6O666j4I6m6,6v5{016q2K0A0g0%1r6u5O6p0P190(3t0b0s6k6m6{6H046Z0m0g0b0P0g1%6W6/6Q5o6`6O0.6}046 0|726+746O0m6b0o0z7a7c7e7j6X7h7f64147l6~707q2|066,753r190P1R0h0h2K7E3q7D7B6/7H7n7J736l7O7u04242L0C3t7W3S7Y2|6.7F6:7m7o717(7^3q6q0h3U7;407Q84470M5^6r6_7@7*6I6e6F6X6)7~7N7k196s8758040P6K2c6Q0$8t3h8n1d0!0!0s0%8x146D6i8k6-7)7t7v7x7b7d7K3c7 7=5n8p6|190W0%0g8R4l8K8L6X6q0s1V6t8d8M8r8F6P198w8h6/7+0C0b0Y898D8=8H6*7L8(6-8e772:7y8Q8W147?8S7O7#8Z8#8J8)7!198,8o7Z7_7+8s8_7_8v8=8{0b792j0%0C9t6%8i195Y934d958l6X9s7S7U8$2Q8T5l8V9q807m9i9R1a959g9n8-9c7P8;9W7=8a2:9*7+5a5c5e5g91199J8%9L9l9r197-0P7/0Y9*9e3n9T479h8!9!7M7s8*196=6@8c9f8:789a7A8/7C8a260Q9;8Nao9!a98uas0mau9-858r9P7VaE88aBaDaq8`a18Ca37:4O0U540s2R2_aW4=1L4@2U2W2S1_1{2U0o1$aZ0U4?1ba: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

.128013s3_8£ufvIy n7aS1me(P24C:jtwi§][hE*@)6o;bcdUg?/XT0lAp!.rF-,$}=k%95{050Q0s0A0o0C0Y0b0l0P0Y0o0b0b0-010A0C0!010406050b0g0r0r0o0%0k040p0M0Y0g160M0m050U1d1f1h1j1b0!041s1z051C0U1C1E1z1b0Q0C0i0~1012140G0C0S0G0Y1S0G0A19050_0O0Y0s1N1113011R1T1V1T0A1#1%1Z0A0O0M0Q1j1!0%1A0A0G0~1m0b0!0o0m140v011)1P010h0{0s0m0o0r0s1Z24262b1+2e1%2h2j190a0l0u0%0M0!0M0b0C1p0m0l0@220%0%0s0P2E1s2m0m1A0U202R0A1~1}1 0Q2o141V0m2g2B1Z1K1M0 1*2#0C2%0m1`1L1Z0!2K1A2P2R2|1c252F2-2c2=0%1g0Y190l0q2O301a2 2n321+3436380v3b263d2P2!013i0o37040l0c3m2Q1b3p3g143s3u0l0w3y3o303q3E380;3I3A3K3C3r0M353t380L3P3e311O3h3U3j3v0n3Z3B3$3D3(3W3v0e3,3R3.3T3V3F0:3@3f3_3M040q0X3~3#2.3`3)0q3a1t3c3Q3 47410q3l4c3n4e46333:3u0q3x4k3z3!3L4p190q3H4t3J4f4o3{4y3O4B4m4w4F423Y4I4v3S4h3+4O3-4g4x423?4T3^4V4L0q3}4Z4D3%4L0v444B1B2`1s2+2U0Q2Y3q0P1`2k1A4?1D4;2~4/4{0@2{4!33190p0u0H0x0j0Z0R0V3I0l4P3_0M190-5i5k470b2904010*0N0y0#0T0$0U0D0/0I0+0f022i0!0N033I5q2c2C190=0,5N4U5P5t0t0K0F0E0)0d0J013P064J3S0.190@0h5U571+0B385=4*3D0h190i3t0C0@5`4n1+18040t633L190r0Q0!693S660K0y3P0l6l5j5V1+5.040C5;4B6n5?3D0O192r6f3_66684/6o3D6b6d6B476h5p6G015m04020Y0A0N6N6w010r0C4y4A2~6O666j4I6m6,6v5{016q2K0A0g0%1r6u5O6p0P190(3t0b0s6k6m6{6H046Z0m0g0b0P0g1%6W6/6Q5o6`6O0.6}046 0|726+746O0m6b0o0z7a7c7e7j6X7h7f64147l6~707q2|066,753r190P1R0h0h2K7E3q7D7B6/7H7n7J736l7O7u04242L0C3t7W3S7Y2|6.7F6:7m7o717(7^3q6q0h3U7;407Q84470M5^6r6_7@7*6I6e6F6X6)7~7N7k196s8758040P6K2c6Q0$8t3h8n1d0!0!0s0%8x146D6i8k6-7)7t7v7x7b7d7K3c7 7=5n8p6|190W0%0g8R4l8K8L6X6q0s1V6t8d8M8r8F6P198w8h6/7+0C0b0Y898D8=8H6*7L8(6-8e772:7y8Q8W147?8S7O7#8Z8#8J8)7!198,8o7Z7_7+8s8_7_8v8=8{0b792j0%0C9t6%8i195Y934d958l6X9s7S7U8$2Q8T5l8V9q807m9i9R1a959g9n8-9c7P8;9W7=8a2:9*7+5a5c5e5g91199J8%9L9l9r197-0P7/0Y9*9e3n9T479h8!9!7M7s8*196=6@8c9f8:789a7A8/7C8a260Q9;8Nao9!a98uas0mau9-858r9P7VaE88aBaDaq8`a18Ca37:4O0U540s2R2_aW4=1L4@2U2W2S1_1{2U0o1$aZ0U4?1ba:0^0`0|04.