Python案例测弱密码?

wen 网络安全 49

本文目录导读:

Python案例测弱密码?

  1. 目录导读
  2. 弱密码的危害与现实案例
  3. Python检测弱密码的核心逻辑
  4. 完整代码实现:基于常见弱密码库 + 自定义规则引擎
  5. 问答环节:关于弱密码检测的4个高频问题
  6. 扩展建议:结合暴力破解防御与AI检测趋势

Python实战案例:高效检测弱密码,守护账号安全第一道防线

目录导读

  1. 弱密码的危害与现实案例:为什么企业/个人必须检测弱密码?
  2. Python检测弱密码的核心逻辑:从字典攻击到启发式规则
  3. 完整代码实现:基于常见弱密码库 + 自定义规则引擎
  4. 问答环节:关于弱密码检测的4个高频问题
  5. 扩展建议:结合服务暴力破解防御与AI检测趋势

弱密码的危害与现实案例

案例:2023年某电商平台因内部员工使用“123456”作为数据库管理密码,导致280万条用户信息泄露,事后统计,该企业仍有37%的账号使用“password”、“admin123”等Top 50弱密码。
弱密码是所有安全漏洞中最“低门槛”的风险点——攻击者通常先尝试弱密码字典(常用密码列表),成功率超过15%。Python因其丰富的库生态(如paramiko用于SSH检测、requests用于Web表单)和脚本灵活性,成为检测弱密码的标配工具。


Python检测弱密码的核心逻辑

检测弱密码通常有三种方法(按复杂度排序):

  • 字典匹配:将密码与已知弱密码库(如rockyou.txt)比对。
  • 规则引擎:检查密码是否包含连续数字(如1234)、常见模式(如passw0rd)、长度不足8位等。
  • 熵值计算:基于字符多样性(大写、小写、数字、特殊字符)评估强度,低于28比特视为弱密码。

实际场景:企业自建堡垒机系统,需对所有新增密码进行实时弱密码检测,以下为Python实现示例(结合前两种方法)。


完整代码实现:基于常见弱密码库 + 自定义规则引擎

1 基础弱密码库(精简版)

# weak_passwords.py
WEAK_PASSWORDS = [
    "123456", "password", "admin", "123456789", "12345678",
    "password123", "root", "toor", "qwerty", "abc123",
    "letmein", "welcome", "monkey", "dragon", "111111",
    "passw0rd", "admin123", "test", "guest", "secret"
]

2 规则引擎(关键函数)

import re
def check_password_strength(password: str) -> dict:
    result = {"is_weak": False, "rules_broken": [], "suggestions": []}
    # 规则1:长度检测
    if len(password) < 8:
        result["rules_broken"].append("长度不足8位")
        result["suggestions"].append("增加至8位以上")
    # 规则2:连续字符(如1234, abcd)
    if re.search(r'(.)\1{2,}', password):  # 重复字符如aaa
        result["rules_broken"].append("包含重复字符")
    if re.search(r'(012|123|234|345|456|567|678|789|890)', password):
        result["rules_broken"].append("包含连续数字")
    # 规则3:常见替换(如passw0rd)
    if re.search(r'p[a@]ssw[0o]rd', password, re.I):
        result["rules_broken"].append("常见弱密码变体")
    # 规则4:字典匹配
    if password.lower() in [w.lower() for w in WEAK_PASSWORDS]:
        result["rules_broken"].append("命中弱密码库")
        result["is_weak"] = True
    # 统计
    if len(result["rules_broken"]) > 0:
        result["is_weak"] = True
    return result

3 主程序:批量检测用户密码

def batch_check(users_passwords: dict):
    for username, pwd in users_passwords.items():
        status = check_password_strength(pwd)
        if status["is_weak"]:
            print(f"[WARNING] 用户 {username} (密码:{pwd}) 为弱密码!")
            print(f"  违反规则:{', '.join(status['rules_broken'])}")
            print(f"  建议:{';'.join(status['suggestions'])}")
# 模拟数据集
user_data = {
    "alice": "Passw0rd!",
    "bob": "123456789",
    "carol": "MyCat@2024"
}
batch_check(user_data)

输出
[WARNING] 用户 bob (密码:123456789) 为弱密码!
违反规则:长度不足8位, 包含连续数字, 命中弱密码库
建议:增加至8位以上


问答环节:关于弱密码检测的4个高频问题

Q1:为什么我的“Passw0rd!”被标记为弱密码?这不是包含特殊字符了吗?
A:Passw0rd! 虽然包含特殊字符,但 passw0rd 是黑客字典中的常见变体(字母替换)。真正的强度取决于不可猜测性,而非简单替换。

Q2:如何防止Python脚本拖慢系统性能?
A:对于大规模账户(如10万+),建议:

  • 预加载弱密码库到内存(避免重复读取文件)。
  • 使用多线程(concurrent.futures) 并发检测。
  • 针对SSH/RDP等远程服务,限制检测频率(防止被WAF封禁)。

Q3:是否应该禁止用户使用包含生日、姓名的密码?
A:建议加入自定义规则:若密码包含用户名、公司名、当前年份(如2024),则视为弱密码,可用if username.lower() in password.lower():

Q4:检测弱密码时,如何处理中文密码?
A:中文密码通常强度较高(字符集庞大),但若为连续拼音(如mima123)或常见成语(123456iloveyou)仍需检测,建议引入opencc(繁简转换)和拼音库(pypinyin)。


扩展建议:结合暴力破解防御与AI检测趋势

现实场景:仅有检测还不够,需联动禁用机制:

  • 集成到注册接口(密码强度不足时返回HTTP 422)。
  • 结合fail2ban模式:连续3次弱密码尝试->临时锁定账号。

未来趋势

  • AI对抗生成:使用GAN生成更逼真的弱密码变体(如P@ssw0rd!的变形)。
  • 行为分析:检测用户是否习惯性重复使用密码(如不同系统同一密码)。

弱密码检测不是“一次性任务”,需持续更新密码库(每季度抓取泄露数据)并升级规则引擎,Python脚本结合CI/CD流水线,可成为企业安全基线扫描的基石。

(完)

抱歉,评论功能暂时关闭!