1. 项目背景与需求分析
"SDUT-实验九-26 检查密码"这个实验题目看似简单,但背后涉及计算机安全领域的基础知识体系。密码验证是任何需要用户认证的系统都必须实现的核心功能,从简单的网站登录到银行系统,都离不开对密码强度的基本校验。
在高校计算机专业的教学体系中,密码检查实验通常安排在数据结构或程序设计课程的中后期。通过这个实验,学生需要掌握:
- 字符串处理的基本方法
- 常见密码规则的实现逻辑
- 防御性编程思想
- 输入验证的安全意识
这个实验的典型要求包括:
- 检查密码长度是否符合要求(通常6-20个字符)
- 验证是否包含数字和字母的组合
- 检查是否有非法字符(如空格)
- 提供清晰的错误提示
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 密码验证的核心算法设计
2.1 基础验证流程
一个健壮的密码检查程序应该遵循以下验证流程:
- 长度检查 → 2. 字符类型检查 → 3. 特殊规则检查 → 4. 综合评估
用伪代码表示:
code复制function validatePassword(password):
if length(password) < 6 or length(password) > 20:
return "长度应在6-20个字符之间"
has_letter = False
has_digit = False
for char in password:
if char is letter:
has_letter = True
elif char is digit:
has_digit = True
elif char is space:
return "密码不能包含空格"
# 其他特殊字符检查...
if not (has_letter and has_digit):
return "必须包含字母和数字"
return "密码有效"
2.2 正则表达式实现
对于有正则表达式基础的学生,可以采用更简洁的实现方式。以下是Python示例:
python复制import re
def check_password(password):
if len(password) < 6 or len(password) > 20:
return False, "长度不符合要求"
if re.search(r'\s', password):
return False, "不能包含空格"
if not re.search(r'[A-Za-z]', password):
return False, "必须包含字母"
if not re.search(r'\d', password):
return False, "必须包含数字"
return True, "密码有效"
提示:在教学环境中,建议先让学生用基础字符串操作实现,再引入正则表达式作为进阶方案。这样能确保学生真正理解底层逻辑。
3. 常见实现问题与调试技巧
3.1 边界条件处理
学生在实现时容易忽略的边界情况:
- 空字符串输入
- 正好6个或20个字符的情况
- 全角字符与半角字符的混用
- Unicode字符的处理
- 连续空格或多个特殊符号的情况
测试用例设计示例:
code复制测试用例 预期结果
"" "密码不能为空"
"12345" "长度不足"
"123456" "必须包含字母"
"abcdef" "必须包含数字"
"abc 123" "不能包含空格"
"a1b2c3d4e5f6g7h8i9j0k" "长度超过限制"
"密码123" "密码有效"(如果允许中文)
3.2 性能优化考虑
虽然密码检查通常不是性能瓶颈,但良好的编程习惯值得培养:
- 避免多次遍历字符串(合并检查条件)
- 使用短路评估(发现一个错误立即返回)
- 预编译正则表达式(如果使用)
- 减少不必要的字符串拷贝
优化后的检查逻辑:
python复制def efficient_check(password):
if not password: return "密码不能为空"
length = len(password)
if length < 6: return "长度不足6个字符"
if length > 20: return "长度超过20个字符"
has_letter = has_digit = False
for char in password:
if char.isspace(): return "不能包含空格"
if char.isalpha(): has_letter = True
elif char.isdigit(): has_digit = True
if not has_letter: return "必须包含字母"
if not has_digit: return "必须包含数字"
return "密码有效"
4. 教学实验的扩展思考
4.1 密码强度评估
基础实验完成后,可以引导学生实现密码强度评估功能。常见的评估维度:
- 长度分:每增加一个字符得1分(上限20)
- 复杂度分:
- 有大写字母 +5
- 有小写字母 +5
- 有数字 +5
- 有特殊符号 +10
- 减分项:
- 纯数字/字母 -10
- 常见弱密码(如"123456")直接判弱
实现示例:
python复制def password_strength(password):
score = 0
# 长度分
score += min(20, len(password))
# 复杂度分
has_upper = any(c.isupper() for c in password)
has_lower = any(c.islower() for c in password)
has_digit = any(c.isdigit() for c in password)
has_special = any(not c.isalnum() for c in password)
if has_upper: score += 5
if has_lower: score += 5
if has_digit: score += 5
if has_special: score += 10
# 减分项
if password.isdigit() or password.isalpha():
score -= 10
weak_passwords = ["123456", "password", "qwerty"]
if password.lower() in weak_passwords:
return 0, "非常弱"
# 评级
if score < 30: return score, "弱"
elif score < 60: return score, "中等"
else: return score, "强"
4.2 安全存储的延伸
虽然密码检查是前端工作,但可以简要介绍密码存储的安全原则:
- 永远不要明文存储密码
- 使用加盐哈希(如bcrypt、PBKDF2)
- 防止时序攻击(恒定时间比较)
- 定期要求更改密码
Python加盐哈希示例:
python复制import bcrypt
# 加密
salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(password.encode(), salt)
# 验证
if bcrypt.checkpw(input_password.encode(), hashed):
print("密码正确")
这个SDUT实验虽然基础,但涵盖了软件开发中非常重要的安全意识和防御性编程思想。在实现过程中,学生应该养成考虑边界条件、设计完备测试用例的习惯,这些能力比单纯完成实验要求更有长远价值。
