基于机器学习的密码强度检测

项目简介

利用机器学习对提供的数据集预测用户输入的密码是否为弱密码。

原始数据集只包含关于弱密码的信息,并没有包含强密码的数据或分类器,这意味着模型无法学习到强密码的规律!!!
我之所以这样设计这个示例,其目的是为了向你展示模型的工作原理。如果在数据集中添加一些强密码的样本和模式信息,那么机器学习算法就能完美运作,并准确预测你的密码是否足够strong.
当然,当你的密码与弱密码数据集差异性较大时,那么也可以视为有一定强度的密码。

实现步骤

  1. 从Kaggle数据集中加载密码及其对应强度的数据;
  2. 对原始数据进行预处理,移除包含缺失密码信息的行;
  3. 将数据集划分为训练集和测试集,以验证模型性能;
  4. 使用字符级别的TF-IDF方法将密码文本转换为数值特征向量,便于机器学习模型处理;
  5. 训练随机森林分类器以预测密码强度,其中设置有100棵树,并使用固定随机种子确保结果可复现;
  6. 在测试集上应用训练好的模型进行预测并计算准确率;
  7. 接收用户输入的密码,利用已训练好的模型预测其强度,并根据预测值判断密码是强还是弱。

最终,该程序在输出模型在测试集上的准确率后,可以实时接收用户输入的密码,为其提供强度评估反馈。

代码实现

import numpy as np # 引入numpy库,用于科学计算
import pandas as pd # 引入pandas库,用于数据处理

# 机器学习相关的库
from sklearn.feature_extraction.text import TfidfVectorizer # 文本特征提取
from sklearn.model_selection import train_test_split # 数据集划分
from sklearn.ensemble import RandomForestClassifier # 随机森林分类器
from sklearn.impute import SimpleImputer # 缺失值填充
from sklearn.metrics import accuracy_score # 准确率计算

# 遍历kaggle输入目录下的所有文件
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

读取密码数据集,并使用朴素贝叶斯模型来评估密码强度:

# 加载密码数据集
data = pd.read_csv("/kaggle/input/passwords/passwords.csv")

# 移除包含缺失值的行
data = data.dropna(subset=["password"])

# 准备特征和目标变量
X = data["password"]
y = data["strength"]

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用简单插值器处理缺失值
imputer = SimpleImputer(strategy="constant", fill_value="")  
X_train = imputer.fit_transform(X_train.values.reshape(-1, 1)).ravel()
X_test = imputer.transform(X_test.values.reshape(-1, 1)).ravel()

# 使用TF-IDF进行特征向量化
vectorizer = TfidfVectorizer(analyzer="char")
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)

# 训练随机森林分类器
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train_tfidf, y_train)

# 在测试集上进行预测并计算准确率
predictions = model.predict(X_test_tfidf)
accuracy = accuracy_score(y_test, predictions)
print("Accuracy:", accuracy)

# 接收用户输入并预测密码强度
password_to_check = input("Enter a password: ")
password_vector = vectorizer.transform([password_to_check])
prediction = model.predict(password_vector)[0]
print(prediction)
if prediction > 4 :
    print("Strong password.")
else:
    print("Weak password.")

步骤包括:

  1. 加载密码数据集;
  2. 清洗数据,去除包含缺失值的行;
  3. 将数据集划分为训练集和测试集;
  4. 使用字符级别的TF-IDF向量化密码文本;
  5. 训练随机森林分类器以评估密码强度;
  6. 对测试集进行预测并计算准确率;
  7. 接收用户输入的密码,并使用模型预测其强度。

不返回任何值,但会打印出密码强度的评估结果。

运行测试

在这里插入图片描述
在这里插入图片描述

优化方向

当然可以从以下方面尝试提高模型准确率:

  1. 数据增强:可以尝试生成更多的训练样本(例如通过密码的组合、变异规则等)来增加模型对各种复杂情况的学习能力。
  2. 特征工程:优化字符级别的TF-IDF向量化过程,比如考虑不同的n-gram范围,或者引入其他有助于区分密码强度的特征。
  3. 尝试更换其他类型的分类器,如SVM、XGBoost、LightGBM或深度学习模型,比较不同模型在该问题上的表现。
  4. 对当前使用的随机森林模型进行参数调优,使用GridSearchCV或RandomizedSearchCV搜索最佳的超参数组合,如树的数量(n_estimators)、最大深度(max_depth)、最小叶子节点样本数(min_samples_leaf)等。
  5. 集成学习:除了单一模型外,还可以尝试使用集成方法,例如结合多个模型的预测结果,进一步提升性能。
  6. 处理不平衡类别:如果训练集中强密码和弱密码的比例严重失衡,需要采取过采样、欠采样或其他平衡策略来处理类别不平衡问题。
  7. 评估指标:根据实际需求选择合适的评估指标,例如对于这种二分类问题,精确率、召回率以及F1值可能更有意义,而不是仅仅依赖于整体的准确率。
  8. 模型解释与错误分析:深入理解模型为何做出某些预测,并分析预测错误的样本,找出其中的规律和特点,据此改进模型或预处理步骤。
  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘侠伍十七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值