vinayagrawal890/phishing-email-detection-model

GitHub: vinayagrawal890/phishing-email-detection-model

一个基于Scikit-learn的机器学习项目,通过提取邮件文本和URL特征来分类钓鱼邮件和安全邮件,提供从数据生成到模型评估及CLI预测的完整教学流程。

Stars: 0 | Forks: 0

# 📧 Phishing 邮件检测模型 这是一个使用 **Scikit-learn** 构建的机器学习项目,它根据邮件的文本内容以及 URL/结构特征,将邮件分类为 **Phishing**(钓鱼)或 **Safe**(安全)。本项目作为一个小型探索项目,旨在研究机器学习在网络安全领域的应用。 ## ✨ 功能 - **合成数据集生成器** — 无需外部下载即可生成逼真的钓鱼邮件和合法邮件(包括发件人、主题、正文) - **特征提取** 涵盖: - TF-IDF 文本特征(主题 + 正文,1-2 grams) - 邮件中的 URL 数量 - 基于 IP 地址的 URL (`http://192.168.x.x/...`) - 可疑的顶级域名(`.xyz`、`.top`、`.click`、`.ru` 等) - 仿冒品牌域名(`paypa1`、`amaz0n` 等) - 可疑/紧急关键词计数("verify"、"urgent"、"suspended" 等) - 发件人域名不匹配检测(在非官方域名中使用品牌名称) - 结构信号:主题/正文长度、感叹号、大写单词数、HTTPS 使用情况 - **模型训练** — Logistic Regression(默认)、Naive Bayes 或 Random Forest - **模型评估** — 准确率、精确率、召回率、F1、ROC-AUC 以及完整的分类报告 - **可视化报告** — 混淆矩阵热力图 + ROC 曲线,保存为 PNG 格式 - **可解释性** — 打印促使模型预测为 Phishing 或 Safe 的热门词汇/特征 - **独立的推理脚本** — 通过命令行对任意新邮件进行分类 ## 📦 环境要求 ``` pip install -r requirements.txt ``` 或者单独安装:`pandas`、`numpy`、`scikit-learn`、`scipy`、`matplotlib`、`seaborn`、`joblib`。 ## 🚀 快速开始 ### 1. 生成数据集 ``` python3 generate_dataset.py ``` 这将创建包含 600 封带标签邮件(300 封钓鱼邮件 / 300 封安全邮件)的 `emails_dataset.csv` 文件。 ### 2. 训练模型 ``` python3 train_model.py ``` 默认情况下,这将训练一个 Logistic Regression 模型,打印评估指标,并保存: - `phishing_model.joblib` — 训练好的模型包 - `phishing_model_evaluation.png` — 混淆矩阵 + ROC 曲线 ### 3. 对新邮件进行分类 ``` python3 predict_email.py \ --sender "security@paypa1-support.com" \ --subject "Urgent: verify your account" \ --body "Click here immediately to verify your account or it will be suspended: http://paypa1-verify.com/login" ``` 输出: ``` ================================================== Email Classification Result ================================================== Prediction: 🚨 PHISHING Phishing probability: 99.99% ================================================== ``` ## ⚙️ 选项 ### `train_model.py` | 标志 | 描述 | 默认值 | |------|-------------|---------| | `--data` | 包含 `sender,subject,body,label` 列的 CSV 文件路径 | `emails_dataset.csv` | | `--model` | `logistic`、`naive_bayes` 或 `random_forest` | `logistic` | | `--test-size` | 用于测试的数据比例 | `0.25` | | `--out-prefix` | 保存的模型/报告文件的前缀 | `phishing_model` | ``` python3 train_model.py --model random_forest --out-prefix rf_model ``` ### `predict_email.py` | 标志 | 描述 | |------|-------------| | `--model` | 已保存的 `.joblib` 模型包路径 | | `--sender` | 发件人邮箱地址 | | `--subject` | 邮件主题 | | `--body` | 邮件正文文本 | ## 📊 结果示例 在合成数据集上使用默认的 Logistic Regression 模型(预留测试集,划分时确保测试集中的邮件措辞在训练期间从未见过): | 指标 | 得分 | |--------|-------| | Accuracy | **98.3%** | | Precision | 100% | | Recall | 97.5% | | F1-score | 98.7% | | ROC-AUC | 99.9% | **混淆矩阵:** | | 预测为安全 | 预测为 Phishing | |---|---|---| | **实际安全** | 60 | 0 | | **实际 Phishing** | 3 | 115 | 该模型在此测试集上的误报率为零(没有安全邮件被误分类为 Phishing),并且在 118 封钓鱼邮件中仅漏报了 3 封——这些通常是语气比较隐晦、偏向商务交流的钓鱼邮件,它们没有使用明显的紧急性词汇。 **促使预测为 Phishing 的主要特征:** 可疑 TLD、发件人域名不匹配、可疑关键词计数、URL 数量、仿冒品牌域名。 **促使预测为 Safe 的主要特征:** 较长的正文长度、使用 HTTPS、常见的合法措辞(例如 "shipping address," "info")。 ## 🧠 工作原理 1. **生成/加载数据** — 包含发件人、主题、正文以及 `phishing`/`safe` 标签的邮件。 2. **提取特征** — 将工程化的数值特征与邮件文本的 TF-IDF 向量结合。 3. **划分训练集/测试集** — 采用基于组(底层邮件模板)的划分方式,确保测试集不受训练集中近乎重复措辞的干扰,从而得出客观的准确率估计。 4. **训练** — 在组合特征矩阵上拟合分类器(默认为 Logistic Regression)。 5. **评估** — 计算准确率、精确率、召回率、F1、ROC-AUC,并生成混淆矩阵 + ROC 曲线图。 6. **保存与复用** — 将模型、vectorizer 和 scaler 一起持久化,以便在无需重新训练的情况下对新邮件进行分类。 ## 📁 项目结构 ``` phishing_detector/ ├── generate_dataset.py # Synthetic dataset generator ├── feature_extraction.py # Feature engineering (URLs, keywords, domains, etc.) ├── train_model.py # Training + evaluation pipeline ├── predict_email.py # Classify a new email using the saved model ├── requirements.txt ├── emails_dataset.csv # Generated dataset (created by generate_dataset.py) ├── phishing_model.joblib # Saved trained model (created by train_model.py) └── phishing_model_evaluation.png # Confusion matrix + ROC curve (created by train_model.py) ``` ## 🗂 数据集 本项目内置了**合成数据集生成器**,而不是使用真实世界的数据集,因此无需下载即可开箱即用。该生成器利用现实世界中的常见模式(紧迫感、账号停用威胁、品牌冒充、相似域名)创建钓鱼邮件,同时生成逼真的合法商务/个人邮件——包括在双方中故意设置的一些“困难”样本(使用紧急语言的合法邮件;语气冷静、偏向商务风格的钓鱼邮件),以确保分类任务不会过于简单。 对于真实项目,可以替换为真实的带标签数据集,例如: - [Kaggle: Phishing Email Detection](https://www.kaggle.com/datasets) (搜索 "phishing email") - [Nazario Phishing Corpus](https://monkey.org/~jose/phishing/) - [Enron-Spam dataset](https://www2.aueb.gr/users/ion/data/enron-spam/) (用作合法/垃圾邮件基线) 只要你的 CSV 包含 `sender`、`subject`、`body` 和 `label` 列(标签为 `phishing`/`safe`),`train_model.py` 就能直接在其上运行。 ## ⚠️ 局限性 - 内置数据集是合成/模板化的——现实中的钓鱼邮件种类繁多,在真实数据上的结果可能会低于此处显示的结果 - 特征工程使用的是简单的启发式方法(关键词列表、regex 模式),而不是实时的威胁情报源 - 不处理 HTML 邮件正文、嵌入图像或附件——仅进行纯文本分析 - Random Forest / Naive Bayes 在合成数据集上达到 100% 的准确率是数据集多样性有限的标志,而不是声称 Phishing 检测问题已经完全解决 - 这是一个教育工具,并非用于生产环境的邮件安全过滤器 ## 🛣️ 可能的扩展 - 在真实数据集上进行训练并报告结果 - 添加交叉验证,而不是单一的 train/test 划分 - 整合 WHOIS/域名年龄查询作为特征 - 尝试深度学习方法(例如在邮件文本上微调 transformer) - 构建一个简单的 Web UI(Flask/Streamlit)以进行交互式分类 ## 📚 学习成果 本项目展示了: - 如何为安全 ML 任务设计特定领域的特征(URL、关键词、发件人域名) - 如何在 Scikit-learn 中将结构化特征与 TF-IDF 文本向量相结合 - 为什么简单的 train/test 划分会产生误导性的完美准确率(以及如何通过按模板分组来避免这种情况) - 如何正确评估分类器:仅看准确率是不够的——精确率、召回率、F1 和混淆矩阵能反映更全面的情况 - 如何解释线性模型的系数,以理解它*为什么*会做出这样的预测 ## 📝 License 本项目仅提供用于教育目的。
标签:Apex, Scikit-learn, 机器学习, 网络安全, 逆向工具, 钓鱼检测, 隐私保护