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 提示,服务端必须再跑一遍同样逻辑。

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