Password Strength Checker

python

def is_strong(password):
    msg = 'Password must contain at least'
    if len(password) < 8:
        return False, msg + " 8 characters"

    has_upper = any(c.isupper() for c in password)
    has_lower = any(c.islower() for c in password)
    has_digit = any(c.isdigit() for c in password)
    special_chars = set("!@#$%^&*-_+=")
    has_special = any(c in special_chars for c in password)

    if not has_upper:
        return False, msg + " one uppercase letter."
    if not has_lower:
        return False, msg + " one lowercase letter."
    if not has_digit:
        return False, msg + " one digit."
    if not has_special:
        return False, msg + " one special char (!@#$%^&*-_+=)"

    return True, "Password is strong!"

password = input("Enter your password: ")
valid, message = is_strong(password)
print(message)

Enhanced Password Strength Checker

python

import re

def is_strong(password):
    """
    Check if a password is strong based on multiple criteria.
    Returns (is_valid, message) tuple.
    """
    # Define criteria and error messages
    criteria = [
        {
            'check': len(password) >= 8,
            'message': "at least 8 characters"
        },
        {
            'check': bool(re.search(r'[A-Z]', password)),
            'message': "one uppercase letter (A-Z)"
        },
        {
            'check': bool(re.search(r'[a-z]', password)),
            'message': "one lowercase letter (a-z)"
        },
        {
            'check': bool(re.search(r'[0-9]', password)),
            'message': "one digit (0-9)"
        },
        {
            'check': bool(re.search(r'[!@#$%^&*\-_+=]', password)),
            'message': "one special character (!@#$%^&*-_+=)"
        }
    ]
    
    # Check all criteria
    failed_checks = [criterion['message'] for criterion in criteria if not criterion['check']]
    
    if failed_checks:
        error_msg = "Password must contain:\n" + "\n".join(f"โ€ข {msg}" for msg in failed_checks)
        return False, error_msg
    
    return True, "โœ… Password is strong!"

def get_password_strength_score(password):
    """
    Calculate a password strength score (0-100)
    """
    score = 0
    
    # Length score (max 25 points)
    length = len(password)
    if length >= 12:
        score += 25
    elif length >= 8:
        score += 15
    elif length >= 6:
        score += 5
    
    # Character variety score (max 75 points)
    checks = [
        bool(re.search(r'[A-Z]', password)),  # Uppercase
        bool(re.search(r'[a-z]', password)),  # Lowercase
        bool(re.search(r'[0-9]', password)),  # Digits
        bool(re.search(r'[!@#$%^&*\-_+=]', password)),  # Special chars
        len(set(password)) / len(password) > 0.7  # Character diversity
    ]
    
    score += sum(15 for check in checks if check)  # 15 points per met criteria
    
    return min(score, 100)

def suggest_strong_password():
    """
    Generate a strong password suggestion
    """
    import random
    import string
    
    # Define character sets
    uppercase = string.ascii_uppercase
    lowercase = string.ascii_lowercase
    digits = string.digits
    special_chars = "!@#$%^&*-_+="
    
    # Generate password with at least one of each type
    password = [
        random.choice(uppercase),
        random.choice(lowercase),
        random.choice(digits),
        random.choice(special_chars)
    ]
    
    # Add more random characters to reach 12 characters
    all_chars = uppercase + lowercase + digits + special_chars
    password.extend(random.choice(all_chars) for _ in range(8))
    
    # Shuffle the password
    random.shuffle(password)
    
    return ''.join(password)

def password_strength_checker():
    """
    Interactive password strength checker
    """
    print("๐Ÿ” Password Strength Checker")
    print("=" * 40)
    print("Requirements:")
    print("โ€ข At least 8 characters")
    print("โ€ข Uppercase and lowercase letters")
    print("โ€ข At least one digit")
    print("โ€ข At least one special character (!@#$%^&*-_+=)")
    print("Type 'quit' to exit\n")
    
    while True:
        password = input("Enter your password: ").strip()
        
        if password.lower() in ['quit', 'exit', 'q']:
            print("Goodbye! ๐Ÿ‘‹")
            break
        
        if not password:
            print("Please enter a password!")
            continue
        
        # Check password strength
        is_valid, message = is_strong(password)
        strength_score = get_password_strength_score(password)
        
        print(f"\n๐Ÿ“Š Password Analysis:")
        print(f"Strength Score: {strength_score}/100")
        
        if is_valid:
            print("โœ… " + message)
            if strength_score >= 80:
                print("๐ŸŽ‰ Excellent password!")
            elif strength_score >= 60:
                print("๐Ÿ‘ Good password!")
            else:
                print("๐Ÿ’ช Password meets minimum requirements")
        else:
            print("โŒ Password is weak!")
            print(message)
        
        # Offer suggestion
        if not is_valid or strength_score < 60:
            suggest = input("\nWould you like a strong password suggestion? (y/n): ").lower()
            if suggest in ['y', 'yes']:
                suggested = suggest_strong_password()
                print(f"๐Ÿ’ก Suggested strong password: {suggested}")
                print("(Copy this password and use it securely)")
        
        print("-" * 40)

# Quick test function
def test_passwords():
    """
    Test various passwords
    """
    test_cases = [
        "weak",           # Too short
        "weakpassword",   # No uppercase, digits, or special
        "WeakPassword",   # No digits or special
        "Weak123",        # Too short, no special
        "Weak123!",       # Meets all criteria
        "VeryStrongPassword123!@#",  # Very strong
        "abc123",         # No uppercase, no special
        "ABC123!",        # No lowercase
    ]
    
    print("๐Ÿงช Password Test Cases:")
    print("=" * 50)
    
    for password in test_cases:
        is_valid, message = is_strong(password)
        score = get_password_strength_score(password)
        status = "โœ… STRONG" if is_valid else "โŒ WEAK"
        print(f"{password:25} -> {status} (Score: {score}/100)")
        if not is_valid:
            print(f"   Reasons: {message.split(':', 1)[1].strip()}")

if __name__ == "__main__":
    # Run interactive checker
    password_strength_checker()
    
    # Uncomment to run test cases
    # test_passwords()

Simple Version (Similar to Original)

python

import re

def is_strong(password):
    """
    Enhanced version of the original function with better error messages
    """
    if len(password) < 8:
        return False, "Password must contain at least 8 characters"
    
    checks = [
        (bool(re.search(r'[A-Z]', password)), "one uppercase letter (A-Z)"),
        (bool(re.search(r'[a-z]', password)), "one lowercase letter (a-z)"),
        (bool(re.search(r'[0-9]', password)), "one digit (0-9)"),
        (bool(re.search(r'[!@#$%^&*\-_+=]', password)), "one special character (!@#$%^&*-_+=)")
    ]
    
    missing = [msg for check, msg in checks if not check]
    
    if missing:
        error_msg = "Password must contain:\n" + "\n".join(f"โ€ข {msg}" for msg in missing)
        return False, error_msg
    
    return True, "โœ… Password is strong!"

# Main program
if __name__ == "__main__":
    password = input("Enter your password: ")
    valid, message = is_strong(password)
    print(message)

Key Improvements:

  1. Better Error Messages: Shows all missing requirements at once
  2. Regex Validation: More efficient character checking
  3. Strength Scoring: Quantitative strength measurement (0-100)
  4. Password Suggestions: Generates strong password suggestions
  5. Interactive Interface: User-friendly command-line interface
  6. Testing Function: Built-in test cases
  7. Character Diversity: Checks for repeated characters
  8. Modular Design: Separate functions for different functionalities

Example Output:

text

๐Ÿ” Password Strength Checker
========================================
Requirements:
โ€ข At least 8 characters
โ€ข Uppercase and lowercase letters
โ€ข At least one digit
โ€ข At least one special character (!@#$%^&*-_+=)
Type 'quit' to exit

Enter your password: weakpass

๐Ÿ“Š Password Analysis:
Strength Score: 20/100
โŒ Password is weak!
Password must contain:
โ€ข one uppercase letter (A-Z)
โ€ข one digit (0-9)
โ€ข one special character (!@#$%^&*-_+=)

Would you like a strong password suggestion? (y/n): y
๐Ÿ’ก Suggested strong password: X7g!k9@Lp2$q

This enhanced version provides much more detailed feedback and helpful features while maintaining the same core functionality as the original program!

Similar Posts

  • Operator Overloading

    Operator Overloading in Python with Simple Examples Operator overloading allows you to define how Python operators (like +, -, *, etc.) work with your custom classes. This makes your objects behave more like built-in types. 1. What is Operator Overloading? 2. Basic Syntax python class ClassName: def __special_method__(self, other): # Define custom behavior 3. Common Operator Overloading Methods Operator…

  • Dictionaries

    Python Dictionaries: Explanation with Examples A dictionary in Python is an unordered collection of items that stores data in key-value pairs. Dictionaries are: Creating a Dictionary python # Empty dictionary my_dict = {} # Dictionary with initial values student = { “name”: “John Doe”, “age”: 21, “courses”: [“Math”, “Physics”, “Chemistry”], “GPA”: 3.7 } Accessing Dictionary Elements…

  • re.I, re.S, re.X

    Python re Flags: re.I, re.S, re.X Explained Flags modify how regular expressions work. They’re used as optional parameters in re functions like re.search(), re.findall(), etc. 1. re.I or re.IGNORECASE Purpose: Makes the pattern matching case-insensitive Without re.I (Case-sensitive): python import re text = “Hello WORLD hello World” # Case-sensitive search matches = re.findall(r’hello’, text) print(“Case-sensitive:”, matches) # Output: [‘hello’] # Only finds lowercase…

  • Alternation and Grouping

    Complete List of Alternation and Grouping in Python Regular Expressions Grouping Constructs Capturing Groups Pattern Description Example (…) Capturing group (abc) (?P<name>…) Named capturing group (?P<word>\w+) \1, \2, etc. Backreferences to groups (a)\1 matches “aa” (?P=name) Named backreference (?P<word>\w+) (?P=word) Non-Capturing Groups Pattern Description Example (?:…) Non-capturing group (?:abc)+ (?i:…) Case-insensitive group (?i:hello) (?s:…) DOTALL group (. matches…

  • Mutable vs. Immutable Objects in Python ๐Ÿ”„๐Ÿ”’

    Mutable vs. Immutable Objects in Python ๐Ÿ”„๐Ÿ”’ In Python, mutability determines whether an object’s value can be changed after creation. This is crucial for understanding how variables behave. ๐Ÿค” Immutable Objects ๐Ÿ”’ Example 1: Strings (Immutable) ๐Ÿ’ฌ Python Example 2: Tuples (Immutable) ๐Ÿ“ฆ Python Mutable Objects ๐Ÿ“ Example 1: Lists (Mutable) ๐Ÿ“‹ Python Example 2:…

Leave a Reply

Your email address will not be published. Required fields are marked *