我的知识记录

Python 密码强度检测:正则+评分给密码打分教程

Python 写一个密码强度检测函数,从长度、大小写、数字、符号、常见弱密码五个维度评分,返回强中弱等级和改进建议,附完整代码。

场景痛点

做用户注册、改密码功能时,前端要实时提示"密码太弱",后端要拦弱密码。手动写 if-else 一堆,还容易漏判断。用 Python 写一个密码强度评分函数,从长度、字符种类、常见弱密码、连续重复字符几个维度打分,直接返回强度等级和改进建议,前后端都能复用。

用到的库

# 标准库 re, string,不需要安装

完整代码

import re

# 常见弱密码黑名单,实际项目可以从文件读
COMMON_WEAK = {
"123456", "password", "123456789", "12345678", "12345",
"111111", "123123", "admin", "qwerty", "abc123", "000000",
}


def check_password_strength(password):
"""返回 (评分0-4, 等级, 建议列表)"""
score = 0
tips = []

# 1. 长度分
length = len(password)
if length >= 12:
score += 2
elif length >= 8:
score += 1
else:
tips.append("密码至少 8 位,建议 12 位以上")

# 2. 字符种类分
if re.search(r"[a-z]", password):
score += 1
else:
tips.append("建议加小写字母")
if re.search(r"[A-Z]", password):
score += 1
else:
tips.append("建议加大写字母")
if re.search(r"[0-9]", password):
score += 1
else:
tips.append("建议加数字")
if re.search(r"[^a-zA-Z0-9]", password):
score += 1
else:
tips.append("建议加特殊符号(如 !@#)")

# 3. 弱密码黑名单
if password.lower() in COMMON_WEAK:
score = 0
tips = ["这是常见弱密码,必须更换"]

# 4. 连续重复字符(如 aaa、111)
if re.search(r"(.)\1{2,}", password):
score -= 1
tips.append("不要出现连续 3 个相同字符")

score = max(0, min(score, 6))

if score >= 5:
level = "强"
elif score >= 3:
level = "中"
else:
level = "弱"
return score, level, tips


def main():
tests = ["123456", "password", "abc123", "Abc1234!", "MyP@ssw0rd2026!", "aaaa1234"]
for pwd in tests:
score, level, tips = check_password_strength(pwd)
print(f"密码:{pwd:<20} 评分:{score}/6  等级:{level}")
for t in tips:
print(f"    - {t}")


if __name__ == "__main__":
main()

代码讲解

  • 评分制比硬规则灵活:长度够+2,每有一类字符+1,最高 6 分。
  • re.search(r"[a-z]", password) 检查有没有小写字母,大写、数字、符号同理;符号用 [^a-zA-Z0-9] 表示非字母数字。
  • 弱密码黑名单直接查集合,O(1) 命中就归零,防止用户用 123456 这种。
  • (.)\1{2,} 正则检测连续 3 个相同字符,\1 引用前面捕获的字符,{2,} 表示再重复至少 2 次,加起来就是 3 连。
  • 最后 max(0, min(score, 6)) 把分限制在 0-6,避免减分变负。

运行结果

运行后打印 6 个测试密码的评分: - 123456 评分 0,等级弱,提示这是常见弱密码 - abc123 评分 2,等级弱 - Abc1234! 评分 5,等级强 - aaaa1234 因为有连续 aaa,评分被减

前端调用这个函数,实时根据 tips 提示用户改进。

注意事项

  • 这套评分是工程实用版,不是密码学标准。真正高安全场景建议用 zxcvbn 算法(npm 有 zxcvbn,Python 有 zxcvbn 库),能识别键盘相邻键、常见变换。
  • 黑名单只放了几个常见密码,生产环境建议从 rockyou.txt 这种泄露密码字典加载,量大了放内存查也行。
  • 不要把密码明文打印日志,本示例是教学用,实际函数入参只在内存里处理。
  • 连续符号 !!! 也会被 (.)\1{2,} 抓到,如果觉得太严,把阈值改成 {3,}
  • 后端校验不要信任前端,前端只做 UX 提示,服务端必须再跑一遍同样逻辑。

Python 密码强度检测:正则+评分给密码打分教程

标签:

更新时间:2026-09-14 20:42:54

上一篇:Python 读取和设置剪贴板内容:pyperclip 跨平台教程

下一篇:Python 批量修改图片尺寸:等比缩放不拉伸教程