如何利用机器学习建立密码强度分类模型

398 阅读8分钟

使用机器学习构建密码强度分类模型

密码强度是用来衡量一个密码对外部攻击的有效程度。外部攻击的形式是密码破解或暴力攻击。它们的目的是获得对计算机系统或网络的未授权访问。

密码的强度通常用其复杂性、长度和不可预测性来衡量。

网络犯罪和数据泄露正在增加,其主要原因通常是密码遭到破坏。

在本教程中,我们将使用Scikit-Learn建立一个密码分类模型。该模型将给出一个密码的强度,从最低的强度标记为0 到最高的强度标记为2

前提条件

要轻松理解本教程中所解释的概念,你应该。

  • 具备[Python编程]知识。
  • 能够建立一个简单的[机器学习]模型。
  • 有一些[数据分析]知识。
  • 了解关于[自然语言处理]的基本概念。
  • 使用[谷歌Colab笔记本]编写Python代码。

密码数据集

所用的数据集是通过网络搜刮从不同的网站收集的。该数据集包含几个具有不同强度的密码。我们将使用这个数据集来训练我们的模型。

下面是该数据集的一瞥。

Passwords dataset

要下载密码数据集,请点击这个链接。下载密码数据集后,将数据集加载到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()

这段代码将输出加载的数据集的结构和所有的列。输出结果如下所示。

Loaded dataset

从上面的图片来看,我们的数据集有passwordstrength 列。password 列存放密码文本,strength 列包含密码强度。

要检查所有的密码强度值,运行这段代码。

pswd_data['strength'].unique()

输出如下所示。

array([1, 2, 0])

从上面的输出结果来看,我们的密码强度有三个值。0 代表最弱的密码,1 代表中等密码,2 代表最强密码。

这个数据集可能有缺失值,现在让我们检查一下数据集中的缺失值。

检查缺失值

缺失的值会使数据集变得不完整,从而导致不准确的结果。要检查缺失值,请使用这段代码。

pswd_data.isna().sum()

输出显示如下。

Missing values

删除缺失值

从上面的图片来看,我们的数据集有一个缺失值。让我们用下面的代码来删除这个缺失值。

data.dropna(inplace=True)

为了检查缺失值是否被删除,运行这段代码。

data.isnull().sum()

输出如下图所示。

Removing missing values

删除缺失值后,我们将把数据集转换成一个数组。

将数据集转换为数组

一个数组更容易操作。因此我们将使用NumPy Python库。要导入NumPy,使用这段代码。

pswd = np.array(pswd_data)

要看到数组,运行这段代码。

pswd

输出结果如下所示。

Removing missing values

下一步是对我们的数据集进行随机洗牌。洗刷数据集将使数据集更加稳健。这将防止模型记住数据集,确保模型从数据集中学习。

数据集的洗牌

当使用洗牌的数据集时,模型将理解我们数据集中的模式和关系。

为了洗刷我们的数据集,我们将导入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 代表最强的密码。

总结

在本教程中,我们已经学会了如何使用机器学习建立一个密码强度分类器模型。我们首先进行了数据预处理,以正确格式化我们的数据集。然后我们用这个数据集来训练我们的模型。

训练完模型后,它能够做出准确的预测。这个模型可以进一步部署,并作为一个真正的应用程序使用。