11

パスワードの入力が必要なシステムを作ろうとしています。それがすべてlower、upper、またはnumの場合はweakと出力し、2つの条件に当てはまる場合はmedで、すべてが満たされている場合はstrongと出力します。うまくいかないようです。

弱いものと強いものは機能しますが、媒体は機能しません。

どこで間違ったのかわかりません。

def password():

    print ('enter password')
    print ()
    print ()
    print ('the password must be at least 6, and no more than 12 characters long')
    print ()

    password = input ('type your password    ....')


    weak = 'weak'
    med = 'medium'
    strong = 'strong'

    if len(password) >12:
        print ('password is too long It must be between 6 and 12 characters')

    elif len(password) <6:
        print ('password is too short It must be between 6 and 12 characters')


    elif len(password)    >=6 and len(password) <= 12:
        print ('password ok')

        if password.lower()== password or password.upper()==password or password.isalnum()==password:
            print ('password is', weak)

        elif password.lower()== password and password.upper()==password or password.isalnum()==password:
            print ('password is', med)

        else:
            password.lower()== password and password.upper()==password and password.isalnum()==password
            print ('password is', strong)
4

5 に答える 5

34

Holá
最良のアプローチは、正規表現検索を使用
することです これが私が現在使用している機能です

def password_check(password):
    """
    Verify the strength of 'password'
    Returns a dict indicating the wrong criteria
    A password is considered strong if:
        8 characters length or more
        1 digit or more
        1 symbol or more
        1 uppercase letter or more
        1 lowercase letter or more
    """

    # calculating the length
    length_error = len(password) < 8

    # searching for digits
    digit_error = re.search(r"\d", password) is None

    # searching for uppercase
    uppercase_error = re.search(r"[A-Z]", password) is None

    # searching for lowercase
    lowercase_error = re.search(r"[a-z]", password) is None

    # searching for symbols
    symbol_error = re.search(r"[ !#$%&'()*+,-./[\\\]^_`{|}~"+r'"]', password) is None

    # overall result
    password_ok = not ( length_error or digit_error or uppercase_error or lowercase_error or symbol_error )

    return {
        'password_ok' : password_ok,
        'length_error' : length_error,
        'digit_error' : digit_error,
        'uppercase_error' : uppercase_error,
        'lowercase_error' : lowercase_error,
        'symbol_error' : symbol_error,
    }

編集:
ここで Lukasz の提案を無視するのは、特別なシンボル条件検証の更新です。

symbol_error = re.search(r"\W", password) is None
于 2015-09-12T19:43:05.870 に答える
6

password.isalnum()はブール値を返すため、常にpassword.isalnum()==passwordになります。False

==password次の部分を省略します。

if password.lower()== password or password.upper()==password or password.isalnum():
    # ...

次に、すべて上と下の両方、またはすべて上と数字、またはすべて下とすべて数字になることは決してないため、2番目の条件(中)は不可能です。おそらく、代わりに大文字、小文字、および数字の存在を探す必要がありますか?

ただし、最初に別の問題に対処する必要があります。パスワードが文字や数字のみで構成されたalphanumericかどうかをテストしています。数値だけをテストする場合は、 を使用します.isdigit()

文字列メソッドに慣れる必要があるかもしれません。試してみたい便利な方法がいくつ.islower().isupper()あります。たとえば、次のようになります。

>>> 'abc'.islower()
True
>>> 'abc123'.islower()
True
>>> 'Abc123'.islower()
False
>>> 'ABC'.isupper()
True
>>> 'ABC123'.isupper()
True
>>> 'Abc123'.isupper()
False

これらは を使用するよりも高速で冗長ではありませんpassword.upper() == password。以下は同じことをテストします。

if password.isupper() or password.islower() or password.isdigit():
    # very weak indeed

次に習得したいトリックは、文字列をループして、個々の文字をテストできるようにすることです。

>>> [c.isdigit() for c in 'abc123']
[False, False, False, True, True, True]

any()それを関数と組み合わせると、数字である文字があるかどうかをテストできます。

>>> any(c.isdigit() for c in 'abc123')
True
>>> any(c.isdigit() for c in 'abc')
False

パスワードの強度をテストするときに、これらのトリックが便利であることがわかると思います。

于 2013-05-23T09:02:48.380 に答える
2

ここにあなたが書いたもののリメイクがあります:

import re

def password():
    print ('Enter a password\n\nThe password must be between 6 and 12 characters.\n')

    while True:
        password = input('Password: ... ')
        if 6 <= len(password) < 12:
            break
        print ('The password must be between 6 and 12 characters.\n')

    password_scores = {0:'Horrible', 1:'Weak', 2:'Medium', 3:'Strong'}
    password_strength = dict.fromkeys(['has_upper', 'has_lower', 'has_num'], False)
    if re.search(r'[A-Z]', password):
        password_strength['has_upper'] = True
    if re.search(r'[a-z]', password):
        password_strength['has_lower'] = True
    if re.search(r'[0-9]', password):
        password_strength['has_num'] = True

    score = len([b for b in password_strength.values() if b])

    print ('Password is %s' % password_scores[score])

出力 (サンプル):

>>> password()
Enter a password

The password must be between 6 and 12 characters.

Password: ... ghgG234
Password is Strong
于 2013-05-23T09:19:37.507 に答える
1

また、パスワードの強度を調査する機能を探していたところ、中途半端な提案がたくさん見つかりました。私はものに基づいて独自の機能を組み立てました。

助けてほしい

def get_pw_strength( pw ):

    s_lc = set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l', 'o', 'n', 'q', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y', 'x', 'z'])
    s_uc = set(['A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'Q', 'P', 'S', 'R', 'U', 'T', 'W', 'V', 'Y', 'X', 'Z'])
    s_dg = set(['1', '0', '3', '2', '5', '4', '7', '6', '9', '8'])
    s_sp = set(['+', ',', '.', '-', '?', ':', '_', '(', ')', '*', '/', ';', '+', '!'])
    pw_s = 0
    pw_steps = (5, 8, 12) 

    pw_l = len(pw)
    if ( pw_l < 4 ):
        return 0
    for l in pw_steps :
        if ( pw_l > l ):
            pw_s += 1
            #print "length over ", l," giving point", pw_s

    c_lc = c_uc = c_dg = c_sp = 0
    for c in pw :
        if ( c in s_lc ) :
            c_lc += 1
        if ( c in s_uc ) :
            c_uc += 1
        if ( c in s_dg ) :
            c_dg += 1
        if ( c in s_sp ) :
            c_sp += 1
    if ( c_lc + c_uc + c_dg + c_sp  <> pw_l ):
        #print c_lc, c_uc, c_dg, c_sp, pw_l
        #raise Exception "Forbidden chracter"
        return -1
    charset = 0
    if ( c_lc ) :
        pw_s += 1
        charset = len(s_lc)
    if ( c_uc ) :
        pw_s += 1
        charset = len(s_uc)
    if ( c_dg ) :
        pw_s += 1
        charset = len(s_dg)
    if ( c_sp ) :
        pw_s += 2
        charset = len(s_sp)
    entropy = log(pow(charset,pw_l),2)

    return pw_s, entropy
于 2014-05-07T10:37:05.623 に答える