web-dev-qa-db-fra.com

Validation d'un mot de passe - Python

Je dois donc créer un code qui valide si un mot de passe:

  • Est d'au moins 8 caractères
  • Contient au moins 1 numéro
  • Contient au moins 1 lettre majuscule

Voici le code:

def validate():
    while True:
        password = input("Enter a password: ")
        if len(password) < 8:
            print("Make sure your password is at lest 8 letters")
        Elif not password.isdigit():
            print("Make sure your password has a number in it")
        Elif not password.isupper(): 
            print("Make sure your password has a number in it")
        else:
            print("Your password seems fine")
            break

validate()

Je ne sais pas ce qui ne va pas, mais lorsque je saisis un mot de passe comportant un numéro, il ne cesse de me dire que j'ai besoin d'un mot de passe comportant un numéro. Des solutions?

2
HaViK

Vous pouvez utiliser le module re pour les expressions régulières.

Avec cela, votre code ressemblerait à ceci:

import re

def validate():
    while True:
        password = raw_input("Enter a password: ")
        if len(password) < 8:
            print("Make sure your password is at lest 8 letters")
        Elif re.search('[0-9]',password) is None:
            print("Make sure your password has a number in it")
        Elif re.search('[A-Z]',password) is None: 
            print("Make sure your password has a capital letter in it")
        else:
            print("Your password seems fine")
            break

validate()
6
zipa

password.isdigit() ne vérifie pas si le mot de passe contient un chiffre, il vérifie tous les caractères en fonction de:

str.isdigit (): Renvoie true si tous les caractères de la chaîne sont des chiffres et s'il y a au moins un caractère, false sinon.

password.isupper() ne vérifie pas si le mot de passe a une majuscule, il vérifie tous les caractères en fonction de:

str.isupper (): Renvoie true si tous les caractères en majuscule de la chaîne sont en majuscule et s'il existe au moins un caractère en majuscule, false sinon.

Pour une solution, veuillez vérifier la question et la réponse acceptée à vérifier si une chaîne contient un nombre .

Vous pouvez créer votre propre fonction hasNumbers()- (copiée à partir d'une question liée):

def hasNumbers(inputString):
    return any(char.isdigit() for char in inputString)

et une hasUpper()- function:

def hasUpper(inputString):
    return any(char.isupper() for char in inputString)
3
Cleared
r_p = re.compile('^(?=\S{6,20}$)(?=.*?\d)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^A-Za-z\s0-9])')

ce code validera votre mot de passe avec:

  1. longueur minimale est 6 et longueur maximale est 20
  2. au moins inclure un chiffre,
  3. au moins un upcase et une lettre lowcase
  4. au moins des caractères spéciaux
1
MikeZhang

Vous vérifiez les méthodes isdigit et isupper sur l'intégralité de l'objet chaîne de mot de passe, et non sur chaque caractère de la chaîne. Ce qui suit est une fonction qui vérifie si le mot de passe répond à vos exigences spécifiques. Il n'utilise pas de contenu regex. Il imprime également tous les défauts du mot de passe entré.

#!/usr/bin/python3
def passwd_check(passwd):
    """Check if the password is valid.

    This function checks the following conditions
    if its length is greater than 6 and less than 8
    if it has at least one uppercase letter
    if it has at least one lowercase letter
    if it has at least one numeral
    if it has any of the required special symbols
    """
    SpecialSym=['$','@','#']
    return_val=True
    if len(passwd) < 6:
        print('the length of password should be at least 6 char long')
        return_val=False
    if len(passwd) > 8:
        print('the length of password should be not be greater than 8')
        return_val=False
    if not any(char.isdigit() for char in passwd):
        print('the password should have at least one numeral')
        return_val=False
    if not any(char.isupper() for char in passwd):
        print('the password should have at least one uppercase letter')
        return_val=False
    if not any(char.islower() for char in passwd):
        print('the password should have at least one lowercase letter')
        return_val=False
    if not any(char in SpecialSym for char in passwd):
        print('the password should have at least one of the symbols $@#')
        return_val=False
    if return_val:
        print('Ok')
    return return_val

print(passwd_check.__doc__)
passwd = input('enter the password : ')
print(passwd_check(passwd))
1
srinivasu u

Peut-être que vous pouvez utiliser l'expression regex:

re.search(r"[A-Z]", password)

Vérifiez les lettres majuscules.

re.search(r"[0-9]", password)

Vérifiez les chiffres dans le mot de passe.

0
Marcin Świerczyna

Python 2.7 La boucle for attribuera un numéro de condition à chaque caractère. c’est-à-dire que Pa $$ dans une liste serait = 1,2,4,4,2,3,2,2,5. Puisque les ensembles ne contiennent que des valeurs uniques, l’ensemble aurait = 1,2,3,4,5; Par conséquent, puisque toutes les conditions sont remplies, la longueur de l'ensemble serait = 5. si elle était pa $$ w, l'ensemble = 2,4 et que len serait = 2, donc non valide.

name = raw_input("Enter a Password: ")
list_pass=set()
special_char=['#','$','@']
for i in name:
    if(i.isupper()):
      list_pass.add('1')
  Elif (i.islower()):
      list_pass.add('2')
  Elif(i.isdigit()) :
      list_pass.add('3')
  Elif(i in special_char):
      list_pass.add('4')
if len(name) >=6 and len(name) <=12:
    list_pass.add('5')
if len(list_pass) is 5:
    print ("Password valid")
else: print("Password invalid")
0
user2557522

Ce dont vous avez besoin, c’est d’utiliser la fonction intégrée any :

  • any([x.isdigit() for x in password]) retournera True si au moins un chiffre est présent dans password
  • any([x.isupper() for x in password]) retournera True si au moins un caractère est considéré comme majuscule.
0
Maxime Lorant