# password_strength_checker.py

# Foydalanish: python3 password_strength_checker.py password_list.txt

# password_list.txt - har qatorda bitta parol


import sys

import re


def score_password(pw):

    score = 0

    reasons = []


    if len(pw) >= 12:

        score += 3

    elif len(pw) >= 8:

        score += 2

    elif len(pw) >= 6:

        score += 1

    else:

        reasons.append("Too short (<6)")


    if re.search(r'[a-z]', pw) and re.search(r'[A-Z]', pw):

        score += 2

    elif re.search(r'[a-z]', pw) or re.search(r'[A-Z]', pw):

        score += 1

    else:

        reasons.append("No letters")


    if re.search(r'\d', pw):

        score += 1

    else:

        reasons.append("No digits")


    if re.search(r'[^A-Za-z0-9]', pw):

        score += 2

    else:

        reasons.append("No special characters")


    # common patterns to warn about

    if pw.lower() in ('password', '123456', 'qwerty', 'admin'):

        reasons.append("Very common password")


    return score, reasons


def grade(score):

    if score >= 7:

        return "STRONG"

    if score >= 4:

        return "MEDIUM"

    return "WEAK"


if __name__ == "__main__":

    if len(sys.argv) < 2:

        print("Usage: python3 password_strength_checker.py passwords.txt")

        sys.exit(1)

    path = sys.argv[1]

    with open(path, 'r', encoding='utf-8') as f:

        for ln in f:

            pw = ln.strip()

            if not pw:

                continue

            score, reasons = score_password(pw)

            print(f"{pw} -> {grade(score)} (score={score})", end='')

            if reasons:

                print(" | issues: " + "; ".join(reasons))

            else:

                print()

Комментарии