本文目录导读:

可以的,用脚本检查密码强度是一个非常常见且实用的做法,无论是为了注册时的实时提示,还是为了定期审计已有密码,脚本都能高效地完成这个任务。
下面我为你详细解释原理、提供几个不同语言的脚本示例,并讨论其优缺点和注意事项。
密码强度检查的核心原理
密码强度通常不是看“密码本身有多复杂”,而是看抵抗自动化猜测攻击(如暴力破解、字典攻击)的能力,脚本检查通常会从以下几个维度打分或判断:
- 长度: 这是最重要的因素,通常认为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 这类专业的库,并考虑集成泄露检查功能,但即使是一个简单的脚本,也比完全不做任何检查要好得多。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播