本文目录导读:

可以的,用脚本检查密码强度是一个非常常见且实用的做法,无论是为了注册时的实时提示,还是为了定期审计已有密码,脚本都能高效地完成这个任务。
下面我为你详细解释原理、提供几个不同语言的脚本示例,并讨论其优缺点和注意事项。
密码强度检查的核心原理
密码强度通常不是看“密码本身有多复杂”,而是看抵抗自动化猜测攻击(如暴力破解、字典攻击)的能力,脚本检查通常会从以下几个维度打分或判断:
- 长度: 这是最重要的因素,通常认为8位是基本,12位以上是良好,16位以上是优秀。
- 字符种类:
- 小写字母 (a-z)
- 大写字母 (A-Z)
- 数字 (0-9)
- 特殊符号 (!@#$%^&* 等)
- 使用种类越多,强度越高。
- 模式/字典匹配:
- 常见密码: 脚本会检查密码是否是
password、123456、qwerty等常见弱密码。 - 键盘序列:
asdfgh、zxcvbn等。 - 重复/连续字符:
aaaaaa、abcdefg、12345678等。 - 个人信息: 用户名、电子邮件前缀、常见单词等(更高级的检查)。
- 常见密码: 脚本会检查密码是否是
- 熵值 (Entropy): 一个更数学化的概念,衡量密码的不可预测性,脚本可以计算熵值,值越高越强,一个完全随机的12位密码熵值很高。
脚本示例
这里提供 Python 和 Shell 脚本(Bash)的示例,Python 更强大灵活,适合复杂的集成;Bash 适合快速、简单的检查,尤其是在 Linux 服务器上。
Python 脚本 (功能强大,推荐)
这个脚本会打分并给出强度等级,包含长度、字符种类和常见弱密码检查。
import re
import sys
# 常见弱密码列表(实际项目可扩展)
COMMON_PASSWORDS = [
"password", "123456", "12345678", "qwerty", "abc123",
"monkey", "123456789", "letmein", "dragon", "111111",
"baseball", "iloveyou", "trustno1", "sunshine", "master",
# 可以添加更多,或者从文件加载
]
def check_password_strength(password):
score = 0
feedback = []
# 1. 长度检查
length = len(password)
if length < 8:
feedback.append("❌ 密码长度应至少为8位")
elif length < 12:
score += 15
feedback.append("⚠️ 密码长度较短(8-11位)")
elif length < 16:
score += 25
feedback.append("✅ 密码长度良好(12-15位)")
else:
score += 35
feedback.append("✅✅ 密码长度优秀(>=16位)")
# 长度本身也加分,越长越好(但不包括惩罚)
score += min(length * 4, 40) # 长度越长,基础分越高,上限40
# 2. 字符种类检查
has_lower = bool(re.search(r'[a-z]', password))
has_upper = bool(re.search(r'[A-Z]', password))
has_digit = bool(re.search(r'\d', password))
has_special = bool(re.search(r'[!@#$%^&*()_+\-=\[\]{};:\'",.<>?/\\|`~]', password))
types_count = sum([has_lower, has_upper, has_digit, has_special])
if types_count >= 3:
score += 15
if types_count == 4:
feedback.append("✅ 包含所有四类字符")
else:
feedback.append(f"✅ 包含 {types_count} 类字符")
else:
if types_count == 1:
feedback.append("❌ 只包含一类字符,强度很弱")
elif types_count == 2:
feedback.append("⚠️ 只包含两类字符,强度较弱")
score += 5
else: # types_count == 0 理论上不会发生,但防御性编程
feedback.append("❌ 未检测到标准字符?")
score = 0
# 3. 常见弱密码检查 (大小写敏感)
if password.lower() in COMMON_PASSWORDS:
score = 0
feedback.append("❌❌ 这是一个非常常见的弱密码!")
# 键盘序列 / 重复字符等 (简化版)
if re.search(r'(.)\1{2,}', password): # 连续的三个相同字符
score -= 10
feedback.append("⚠️ 包含连续重复字符 (如 'aaa')")
if re.search(r'(abc|bcd|cde|def|efg|fgh|...|xyz|123|234|345|456|567|678|789)', password.lower()):
score -= 10
feedback.append("⚠️ 包含简单连续序列 (如 'abc', '123')")
# 4. 确定最终等级
total_score = max(0, score) # 确保分数不为负数
if total_score < 30:
strength = "非常弱"
elif total_score < 50:
strength = "弱"
elif total_score < 70:
strength = "中等"
elif total_score < 85:
strength = "强"
else:
strength = "非常强"
return total_score, strength, feedback
if __name__ == "__main__":
if len(sys.argv) > 1:
password = sys.argv[1]
else:
# 交互式输入
import getpass
password = getpass.getpass("请输入要检查的密码: ")
score, strength, feedback = check_password_strength(password)
print(f"\n密码强度评分: {score}/100")
print(f"密码强度等级: {strength}")
print("详细反馈:")
for msg in feedback:
print(f" {msg}")
使用方法:
- 保存为
check_pwd_strength.py - 运行:
python check_pwd_strength.py(会提示输入密码,不显示明文) - 或者直接传参:
python check_pwd_strength.py "YourP@ssw0rd!"
Bash Shell 脚本 (快速、简单、适合Linux)
适合在服务器上快速检查或集成到其他脚本中。
#!/bin/bash
if [ -z "$1" ]; then
read -s -p "请输入要检查的密码: " password
echo
else
password="$1"
fi
length=${#password}
score=0
feedback=""
# 1. 长度检查
if [ "$length" -lt 8 ]; then
feedback="❌ 太短 (< 8)"
elif [ "$length" -lt 12 ]; then
score=$((score + 10))
feedback="⚠️ 较短 (8-11)"
elif [ "$length" -lt 16 ]; then
score=$((score + 20))
feedback="✅ 良好 (12-15)"
else
score=$((score + 30))
feedback="✅✅ 优秀 (>= 16)"
fi
# 2. 字符种类检查 (使用grep和正则)
has_lower=$(echo "$password" | grep -c '[a-z]')
has_upper=$(echo "$password" | grep -c '[A-Z]')
has_digit=$(echo "$password" | grep -c '[0-9]')
has_special=$(echo "$password" | grep -c '[!@#$%^&*()_+=-]')
types_count=$((has_lower + has_upper + has_digit + has_special))
if [ "$types_count" -ge 3 ]; then
score=$((score + 15))
feedback="$feedback, $types_count 类字符"
elif [ "$types_count" -eq 2 ]; then
score=$((score + 5))
feedback="$feedback, 仅有2类字符"
else
feedback="$feedback, 仅1类字符! 非常弱"
fi
# 3. 检查是否为常见弱密码 (基础版)
weak_passwords=("password" "123456" "12345678" "qwerty" "abc123" "monkey" "letmein" "dragon")
for weak in "${weak_passwords[@]}"; do
if [ "$(echo "$password" | tr '[:upper:]' '[:lower:]')" = "$weak" ]; then
score=0
feedback="❌❌ 常见弱密码!"
break
fi
done
# 输出结果
echo "密码长度: $length"
echo "字符种类: $types_count"
echo "强度评分: $score/100 (粗略)"
echo "反馈: $feedback"
if [ "$score" -ge 50 ]; then
echo " 强度可接受"
else
echo " 强度不足,请修改"
fi
使用方法:
- 保存为
checkpwd.sh - 赋予执行权限:
chmod +x checkpwd.sh - 运行:
./checkpwd.sh "YourP@ssw0rd!"
优缺点和注意事项
优点:
- 自动化: 可以集成到注册、密码修改流程中。
- 客观: 基于规则,结果一致。
- 灵活: 可以自定义规则、打分标准、弱密码列表。
- 节省资源: 比第三方API更快,无需网络。
缺点:
- 规则是死的:
Tr0ub4dor&3(Troobador&3 的变体)可能评分高,但本质还是基于单词的弱密码,而battery horse staple correct(四个随机单词)可能评分中等,但实际上非常强(高熵值)。 - 无法真正判断真实性: 脚本不知道这个密码是否真的被泄露过,一个看似很长的随机密码,如果出现在数据泄露中(比如你是
..的变体),脚本可能检查不出来。 - 维护成本: 常见密码列表需要定期更新。
改进方向
- 使用专业库: Python 的
zxcvbn库(由Dropbox开发,模拟用户密码猜测难度)是目前非常流行的选择,它考虑了模式、单词、泄露列表等,安装后即可使用:pip install zxcvbn。from zxcvbn import zxcvbn results = zxcvbn("Tr0ub4dor&3") print(results['score']) # 0-4 的分数 print(results['feedback']['warning']) # 警告信息 - 集成泄露检查: 查看密码是否在已知的数据泄露中出现,可以使用 Have I Been Pwned API(k-anonymity 模型,不传输完整密码)。
- 动态黑名单: 维护一个动态的行业通用弱密码或针对你系统的弱密码黑名单。
用脚本检查密码强度是完全可行的,并且是推荐做法。 它能够高效地执行80%的常规检查,帮助用户避免最差的密码选择(如 123456、password)并鼓励使用更长、更多样的密码。
对于更高级的安全需求,建议结合 zxcvbn 这类专业的库,并考虑集成泄露检查功能,但即使是一个简单的脚本,也比完全不做任何检查要好得多。