新密市

首页 » 常识 » 问答 » 用生成模型为自己生成密码,无惧暴力破解
TUhjnbcbe - 2024/4/1 17:27:00

全文共字,预计学习时长8分钟

图片来源:DanMeyers,Unsplash

机器学习和深度学习模型在工业各个领域都得到了广泛运用,网络安全领域也不例外。最新相关的例子就是PassGAN,这个深度学习模型可以生成密码,因而提高了暴力破解(Brute-ForceAttacks)的效率。

本文会引用这个概念,并以此为例,解释生成模型和判别模型的区别;同时也会突出强调深度学习相对其他传统概率模型在处理高维度数据时的优越性。

判别模型vs生成模型

由生成模型和判别模型构成的机器学习/深度学习等众多模型有着众所周知的分类法,每个模型都有各自的特征。但刚入门的数据科学家极易产生混淆。事实上这完全可以理解,毕竟运用情况不同,名称会产生误导。直觉上读者可能会觉得判别模型无非就是区分各种类型的数据或生成新的数据,当然,这无可厚非。但并不意味着生成模型就不能当作分类器来使用,正如其名字所暗示的那样。

两者最根本的区别在于模型是如何学习的。简单来讲,生成模型会学习数据生成的方式,然后对未曾见过数据进行分类,而判别模型只会学习每个类之间的差异(边界)。

举个更具体的例子,想象一下:我们收集了很多有关人或动物的涂鸦。现在想创建一个模型,可以将涂鸦当作数据输入再作为反馈输出,不论它看起来更像人还是动物。

有趣的是,生成模型会先学习怎么画人或者动物的涂鸦,在遇到没见过的涂鸦时,它会先画一个人和一个动物,再与输入图像进行比对。

与此同时,判别模型会学习每个数据类别之间的细微差距,比如说,动物的尾巴、人类的姿势、形状等等。遇到新模型,在没有学习绘画的条件下判别模型会根据这些信息对两个类别进行区分,很简单对吧?

虽然程序员们一般倾向于使用判别模型因为它简单,生成模型也有自身优势,同样开始越来越流行。特别是在数据缺失或者探测异常值的时候,生成模型就非常好用。毕竟我们的目的是生成新数据,而这一点判别模型是做不到的。事实上,生成模型能够生成真实内容也是前不久才实现的。(见下图)

生成模型生成的面部图像:DavidFoster.“生成式深度学习”

可能性

我们尽可能避免使用数学术语,但要想把生成模型和判别模型解释清楚,就免不了会涉及一些数学概念。

假设手头有Y标记的观测指标X。从概率学角度来看,判别分类器会根据P(Y

X)的条件概率建模。也就是说,已知观测指标X,出现Y类数据的概率是多少?别把P(A,B)的条件概率和联合概率混淆了,联合概率是指A和B同时发生的概率。另一方面,生成模型会直接根据P(X)发生的概率建模,简单来说,首先获取观测指标X的概率是多少?要注意在此模型中,不一定非得用标签,但如果想执行分类,可以使用标签来对P(X

Y)进行定义。

简化后的生成模型

为了在实战中理解生成模型,我们来想象一个极简单的场景:只存在于二维空间的生成模型。这个模型的灵感来源是大卫福斯特(DavidFoster)所著的《生成式深度学习》(GenerativeDeepLearning),强烈推荐阅读!

请思考以下在二维空间中由Pdata所产生的一些黑点::

生成模型的任务是要生成一个看起来像是由Pdata生成的新的点X=(x,y)。所以我们构建一个名为Pmodel的Pdata估值,其可能的情况就是橙色区域内生成的点很可能是连续随机分布模型,而区域外不会再生成新的点,如下图所示。

回到刚才里对生成模型的介绍,我们刚创建了一个能辨识创建数据点的模型!虽然非常简单,但你刚开发了一个生成模型!

现在我们深入一些,观察模型在遇到真实的Pdata分布时表现如何。注意,Pdata的初始版本表示内陆地区树的分布概率(如下地图所示)。大致上黑点也就是土地中会长树的区域,概率几乎一样,但不可能长在水里。

值得注意的是,虽然Pmodel是Pdata高度简化的版本,但它仍保留了原始分布的主要机制。通过从Pmodel中A,B,C三个点进行采样,能明显看出我们的模型仍需改善。Pdata不能直接生成C点,而AB两点很难与真实点区分开,这就是生成模型所应达到的效果。生成与已有数据不同的新数据,哪怕它们看起来像是由同一个规则生成的。

概率论vs深度学习方法

这一部分,我们将通过实例探索深度学习为何对生成模型的快速发展作出了巨大贡献。但首先有必要提及一些概率论方法,这样就有比较的标准了。

最大似然估计

最大似然估计是一种统计方法,可用于计算参数,比如模型生成数据是最大值的概率。乍一听可能有些云里雾里的,我们可以结合上文的例子来理解。

假设上文的橙色区域是概率密度函数,简单来说就是任意样本空间(图上的x,y轴)的一个点,作为输出数据这个函数应该给出0到1的任意值。一般来说,用概率密度函数计算出所有点的总和应该都为1。回到刚才的例子,黑点会统一分布在橙色区域内,概率是一个常量,而出现在该区域外的概率为0。其数学表达式如下:

继续,已知θ是4个参数{θ1,θ2,θ3,θ4}的集合,用似然函数L(θ

x)解答此问:

已知点x的参数,求实际值的概率。

读者可能会思考,这些参数是干什么用的?实际上,这些参数来源于统计学一个很有名的领域——参数建模。换言之,就是用有限参数的集合来表示概率的分布。在本例中可以通过4个参数来对概率分布区域进行建模,左上角的点(θ1,θ2),和右下角的点(θ3,θ4)。还有一个更真实的例子就是高斯分布,它有两个参数:平均值μ,和标准方差σ。

更准确地讲,似然函数表达式如下:

其含义为由概率密度函数计算出的x的概率用参数θ表示。

现在我们手头若有多个数据点Xn={x1,x2,…,xn},其似然表示为:

不过这个公式的运算有点麻烦,我们可以将它转换成对数的表示方式,其结果为总和,区分起来也更容易一些。

注意,只有自然对数单调递增时才可能将其转换成对数形式。简单地讲,y随着x的增加而增加,故最大值没有变化。

了解了上面的信息,最初的概念——最大似然估计,理解起来就好多了。或者简单来说,就是找到与数据集X最匹配的参数θ。等于说这些参数最有可能用来对生成X的概率分布进行建模。其正式表达为:

以上信息足够说明如何使用最大似然估计建模,但是这些还只停留在理论层面,笔者所举的例子也不过是为了将其可视化,便于理解。在接下来的部分,我们将利用前文提到的知识开发一个有用的生成模型。

用朴素贝叶斯生成密码

再来想象一个场景,假设你正绞尽脑汁地想一个密码,这时候你想到创建生成模型为自己生成密码!

首先创建一个列表,每一项都是密码中需要包含的元素:

文字:pass,café,bingo,hyper,leet,hackerman,ninjia,babe

数字:,,,,,,,1,2,10,

特殊符号:!,

,$,%,*,_

大写字母:A,E,T,P

根据密码需要遵循的规则定义标准格式:

大写字母+文字+数字+特殊符号

基本上每个密码都可以利用这4个特征来编排,顺序一样:大写字母、文字、数字和特殊符号。全部从上述列表中取值。

使用这种方法,一共可以有8*11*6*4=种组合方法!当然,只从每个特征随机选择一个值放到密码里就可以了,但这样的话密码就会很难记,所以每次都避免输入随机密码。相反,如果能参考之前使用过的密码就比较理想了。用行话来讲,就是应该有一个更偏好特定元素的Ppass分布。

首先,从自己之前使用过的密码中收集30组格式相同的密码。

下图是从数据库前10组密码中提取的元素:

提个问题:密码中包括x的概率是多少?

回忆一下,密码x是由4个特征定义的。这就类似上文介绍的地图上的一个点,但这次不是坐标x,y,本例有4个维度,x1,x2,x3,x4。

一般来说,这个问题的答案就是x1,x2,x3,x4同时发生的概率,即:

用链式法则可以将其拓展到条件概率。表达式如下:

要继续使用朴素贝叶斯模型,我们必须先做出强有力的假设,每个特征与其它特征之间都是独立的。也就是说,大写字母的值与文字和数字的值无关。这个假设够简单了,该方法也由此得名。或许表达式会看得更清楚:

理解了这一点,使用链式法则得出的公式可以简化为:

等等,既然已知值的分布可以被看作是一个范围,那么在描述最大似然估计时,概率密度函数就会由具有4个参数的分布参数集参数化。在这种情况下,概率又是如何进行参数化的呢?

因为数据集中包含离散值,如果读者愿意从更抽象的角度来理解,有限集合里所包含的元素可以使用多项分布,其结果就是多项朴素贝叶斯。在这种情况下,我们可以简单地给模型中每个特征的各个值都分配一个参数,那么总共会得到8+11+6+4-4=25个参数。

-4是为了补偿每个特征最后一个值,算上它是为了使总和为1,但其实并不需要计算。

另外,要在多项分布里算出最大似然估计,我们只需要用每个特征的值出现的次数除以观察的总次数就可以了,公式如下:

特征参数的最大似然估计值

现在我们已经计算出了每个特征的最大似然估计值,就可以从每个特征取值,组合到一起,得到新密码!下图是我们通过这个模型组合出来的10个密码:

注意,模型生成了数据库中原本没有的密码!(Ahyper!,Apass10$...)

在下面的GoogleColab链接中,你可以找到更多关于生成朴素贝叶斯模型的相关代码。

传送门:

1
查看完整版本: 用生成模型为自己生成密码,无惧暴力破解