使用机器学习构建密码强度分类模型
密码强度是用来衡量一个密码对外部攻击的有效程度。外部攻击的形式是密码破解或暴力攻击。它们的目的是获得对计算机系统或网络的未授权访问。
密码的强度通常用其复杂性、长度和不可预测性来衡量。
网络犯罪和数据泄露正在增加,其主要原因通常是密码遭到破坏。
在本教程中,我们将使用Scikit-Learn建立一个密码分类模型。该模型将给出一个密码的强度,从最低的强度标记为0 到最高的强度标记为2 。
前提条件
要轻松理解本教程中所解释的概念,你应该。
- 具备[Python编程]知识。
- 能够建立一个简单的[机器学习]模型。
- 有一些[数据分析]知识。
- 了解关于[自然语言处理]的基本概念。
- 使用[谷歌Colab笔记本]编写Python代码。
密码数据集
所用的数据集是通过网络搜刮从不同的网站收集的。该数据集包含几个具有不同强度的密码。我们将使用这个数据集来训练我们的模型。
下面是该数据集的一瞥。

要下载密码数据集,请点击这个链接。下载密码数据集后,将数据集加载到Google Colab笔记本中。
将数据集加载到Google Colab中
为了加载数据集,我们需要Pandas Python库。让我们导入pandas。
import pandas as pd
要使用Pandas加载数据集,请运行这段代码。
pswd_data = pd.read_csv("/content/data.csv",error_bad_lines=False)
在上面的代码中,我们添加了error_bad_lines=False 命令,这样pandas ,只读取数据集的完整数据样本。加入这个命令后,我们的数据集就会被加载,不会有任何错误。
要知道我们的数据集是否被成功加载,运行这段代码。
pswd_data.head()
这段代码将输出加载的数据集的结构和所有的列。输出结果如下所示。

从上面的图片来看,我们的数据集有password 和strength 列。password 列存放密码文本,strength 列包含密码强度。
要检查所有的密码强度值,运行这段代码。
pswd_data['strength'].unique()
输出如下所示。
array([1, 2, 0])
从上面的输出结果来看,我们的密码强度有三个值。0 代表最弱的密码,1 代表中等密码,2 代表最强密码。
这个数据集可能有缺失值,现在让我们检查一下数据集中的缺失值。
检查缺失值
缺失的值会使数据集变得不完整,从而导致不准确的结果。要检查缺失值,请使用这段代码。
pswd_data.isna().sum()
输出显示如下。

删除缺失值
从上面的图片来看,我们的数据集有一个缺失值。让我们用下面的代码来删除这个缺失值。
data.dropna(inplace=True)
为了检查缺失值是否被删除,运行这段代码。
data.isnull().sum()
输出如下图所示。

删除缺失值后,我们将把数据集转换成一个数组。
将数据集转换为数组
一个数组更容易操作。因此我们将使用NumPy Python库。要导入NumPy,使用这段代码。
pswd = np.array(pswd_data)
要看到数组,运行这段代码。
pswd
输出结果如下所示。

下一步是对我们的数据集进行随机洗牌。洗刷数据集将使数据集更加稳健。这将防止模型记住数据集,确保模型从数据集中学习。
数据集的洗牌
当使用洗牌的数据集时,模型将理解我们数据集中的模式和关系。
为了洗刷我们的数据集,我们将导入random Python包。
import random
现在我们可以使用下面的代码随机洗刷数据集。
random.shuffle(pswd)
添加特征和标签
在机器学习中,特征是我们数据集中的所有独特的独立变量,它们被用作模型的输入。在这里,我们的特征位于password 列中。password 栏里有所有的文本密码,这些密码将训练我们的模型。
标签是我们数据集中的变量,被用作模型的输出。在这里,我们的标签位于strength 列中。strength 列有三个值,0、1和2。
我们将使用以下代码添加特征和标签。
ylabels = [s[1] for s in pswd]
allpasswords = [s[0] for s in pswd]
在上面的代码中,我们把我们的标签保存在ylabels 变量中。该代码在各列中循环,并选择最后一列(1)作为标签。我们还将我们的特征保存在allpasswords 列中。该代码在各列中循环,并选择列(0)作为特征。
运行下面的代码来检查我们数据集中的密码和标签的数量。
标签的数量。
len(ylabels)
输出结果如下所示。
669639
密码的数量。
len(allpasswords)
输出
669639
从上面的输出来看,这个数据集很大,有很多数据样本。我们现在可以使用该数据集来建立我们的模型。
符号化过程
代号化是将文本数据分解成更简单的字符的过程,称为代号。我们将把我们的密码文本分解成单词标记,我们将使用这些标记作为我们模型的输入。
为了执行这个过程,我们将创建一个自定义函数。该函数createTokens ,将循环浏览我们的数据集,并返回转换后的令牌。
def createTokens(f):
tokens = []
for i in f:
tokens.append(i)
return tokens
将单词标记转换为数字数据
机器学习模型不能理解文本。因此,我们需要进一步将单词标记转换为数字数据。
我们将使用TfidfVectorizer 包将单词标记转换为数字数据(数字的向量)。使用TfidfVectorizer ,它将根据每个单词标记在数据集中出现的频率进行转换。
我们将使用以下代码导入这个包。
from sklearn.feature_extraction.text import TfidfVectorizer
让我们初始化TfidfVectorizer 。
初始化TfidfVectorizer
vectorizer = TfidfVectorizer(tokenizer=createTokens)
在上面的代码中,我们已经初始化了TfidfVectorizer ,并且还将createTokens 函数作为一个参数传递。然后,我们将使用fit_transform 方法将vectorizer 拟合到我们的数据集,将其转换为数字数据。
X = vectorizer.fit_transform(allpasswords)
我们的输入数据(特征)被保存在allpasswords 变量中。
分割矢量数据集
分割数据集会产生两个集合;一个将用于训练模型,另一个用于测试。为了分割数据集,我们将使用train_test_split 。
from sklearn.model_selection import train_test_split
分割功能将如下。
X_train, X_test, y_train, y_test = train_test_split(X, ylabels, test_size=0.2, random_state=42)
我们使用了一个test_size=0.2 ,这样,80% 的数据被用于训练,20% 用于测试。
现在让我们来建立模型
建立模型
我们将使用DecisionTreeClassifier 算法建立我们的模型。这种算法最适合于分类问题。它能产生一个具有非常准确分数的模型。
from sklearn.tree import DecisionTreeClassifier
为了使用该算法,我们将使用以下代码来初始化它。
clf=DecisionTreeClassifier()
最后,我们在训练集数据集上拟合该算法。这将确保模型能从数据集中充分学习。随着时间的推移,该模型将理解我们数据集中的模式和关系。
clf.fit(X_train, y_train)
让我们来计算一下这个训练过的模型的准确度得分。
使用训练数据集的准确度得分
要获得准确率得分,请使用这段代码。
print("Accuracy :",logit.score(X_test, y_test))
准确率得分显示如下。
Accuracy : 0.9998114655103219
这是99.98114% 。这是第一次训练;这是一个很好的准确性分数。我们将使用测试数据集来测试这个模型。
模型测试
我们将使用这些数据作为训练好的模型的输入,这样它就可以对这个数据集中的数据点进行分类。
y_pred=clf.predict(X_test)
y_pred
它将产生以下输出。
array([0, 0, 1, ..., 1, 1, 0])
使用测试数据集的准确率得分
在这一节中,我们将使用测试数据集检查准确率得分,这样我们就能知道我们的模型是否过度拟合了。当模型在训练数据集上表现很好,但在测试数据集上表现很差时,就会出现过拟合。
使用这段代码。
print("Accuracy :",clf.score(X_test, y_test))
输出如下图所示。
Accuracy : 0.9738516217669195
这是97.385 。如果我们把它与使用训练数据集得到的准确度进行比较,它仍然是一个很好的准确度分数。因此,我们的模型没有过度拟合,可以用来进行单一预测。
单一预测
在单一预测中,我们向我们的模型输入密码样本,让它进行预测。我们将使用以下的输入密码。
X_predict = ['drshsyqb*',
'python'
'littledotsK18@#',
'password##@',
'ajd1348#28t**',
'gtddsdsaa',
'silasaw',
'123456',
'abcdef']
为了进行这些预测,运行以下代码。
X_predict = vectorizer.transform(X_predict)
y_Predict = clf.predict(X_predict)
print(y_Predict)
从上面的代码来看,vectorizer.transform 方法将把密码文本转换成数字数据。clf.predict 方法将进行预测。print 将打印预测结果,如下所示。
[1 2 1 2 1 0 0 2]
从上面的输出结果来看,该模型能够对密码强度进行分类。0 代表最弱的密码,1 代表中等密码,2 代表最强的密码。
总结
在本教程中,我们已经学会了如何使用机器学习建立一个密码强度分类器模型。我们首先进行了数据预处理,以正确格式化我们的数据集。然后我们用这个数据集来训练我们的模型。
训练完模型后,它能够做出准确的预测。这个模型可以进一步部署,并作为一个真正的应用程序使用。