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

  • reΒ module

    The re module is Python’s built-in module for regular expressions (regex). It provides functions and methods to work with strings using pattern matching, allowing you to search, extract, replace, and split text based on complex patterns. Key Functions in the re Module 1. Searching and Matching python import re text = “The quick brown fox jumps over the lazy dog” # re.search()…

  • Negative lookbehind assertion

    A negative lookbehind assertion in Python’s re module is a zero-width assertion that checks if a pattern is not present immediately before the current position. It is written as (?<!…). It’s the opposite of a positive lookbehind and allows you to exclude matches based on what precedes them. Similar to the positive lookbehind, the pattern…

  • AttributeError: ‘NoneType’ Error in Python re

    AttributeError: ‘NoneType’ Error in Python re This error occurs when you try to call match object methods on None instead of an actual match object. It’s one of the most common errors when working with Python’s regex module. Why This Happens: The re.search(), re.match(), and re.fullmatch() functions return: When you try to call methods like .group(), .start(), or .span() on None, you get this error. Example That Causes…

  • Variable Length Keyword Arguments in Python

    Variable Length Keyword Arguments in Python Variable length keyword arguments allow a function to accept any number of keyword arguments. This is done using the **kwargs syntax. Syntax python def function_name(**kwargs): # function body # kwargs becomes a dictionary containing all keyword arguments Simple Examples Example 1: Basic **kwargs python def print_info(**kwargs): print(“Information received:”, kwargs) print(“Type of…

  • Nested for loops, break, continue, and pass in for loops

    break, continue, and pass in for loops with simple examples. These statements allow you to control the flow of execution within a loop. 1. break Statement The break statement is used to terminate the loop entirely. When break is encountered, the loop immediately stops, and execution continues with the statement immediately following the loop. Example:…

  • Default Arguments

    Default Arguments in Python Functions Default arguments allow you to specify default values for function parameters. If a value isn’t provided for that parameter when the function is called, Python uses the default value instead. Basic Syntax python def function_name(parameter=default_value): # function body Simple Examples Example 1: Basic Default Argument python def greet(name=”Guest”): print(f”Hello, {name}!”)…

Leave a Reply

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