0x00 起因
最近刷src有点进入瓶颈,想写写代码学学新东西换换脑子,最近机器学习,深度学习的话题那么火热,我也想来动手学学。学之前我以为机器学习和深度学习是一种东西,现在才知道原来是包含关系,原本以为会用到大名鼎鼎的Tensorflow,学习之后遇到了另一位厉害的朋友——scikit-learn。

0x01 介绍
本文所涉及的内容主要参考了fsecurify.com/machine-learning-based-password-strength-checking/(目前链接已经无法访问,但是可以通过googlecache查看到文章的内容),代码和数据大量借鉴了github.com/faizann24/Machine-Learning-based-Password-Strength-Classification十分感谢。

0x02 数据处理
教程中提供了约60万条密码,根据强度由弱到强分为了0,1,2。

0 for weak, 1 for medium and 2 for strong
lamborghin1,1
AVYq1lDE4MgAZfNt,2
u6c8vhow,1
v1118714,1
universe2908,1
as326159,1
asv5o9yu,1
intel1,0
612035180tok,1
jytifok873,1
WUt9IZzE0OQ7PkNE,2
lsdlsd1,0

使用每个字母的Tf-idf分数,并没有把密码长度,特殊字符的使用加入分析。
为了对每个字母进行Tf-idf分数计算,需要自定义TfidfVectorizer的tokenizer

def getTokens(inputString):
	tokens = []
	for i in inputString:
		tokens.append(i)
	return tokens

TfidfVectorizer转换为Tf-idf密码语料,并且划分数据

vectorizer = TfidfVectorizer(tokenizer=getTokens)
X = vectorizer.fit_transform(allpasswords)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

使用逻辑回归模型进行机器学习

lgs = LogisticRegression(penalty='l2',multi_class='ovr')
lgs.fit(X_train, y_train)
print(lgs.score(X_test, y_test))

此时准确度能够达到81%
原文章中提到的测试数据

预测结果
faizanahmad [medium]
faizanahmad123 [medium]
faizanahmad## [medium]
ajd1348#28t** [strong]
ffffffffff [easy]
kuiqwasdi [medium]
uiquiuiiuiuiuiuiuiuiuiuiui [easy]
mynameis123faizan# [strong]
faizan [easy]
abcdef [easy]

其中关键的不是预测对的,而是123456预测结果是1[medium]
经过测试12345预测结果也是1[medium],1234预测结果也是1[medium]

不过正确率能够达到81%已经非常不错了

0x03 改进

出现对数字预测错误的原因我分析在原来的数据中纯数字的比例太低,我又自己增加了大约30万条大多由数字组成的密码。
由于后30万条密码是由我写脚本自动分类,与前60万条的标准不太一样,所以出现了准确率反而下降的现象,最终准确率之后78%,实际上也差不多。
测试发现机器学习大抵的规则是5个以上不同字符为中

实际上,密码强度这种能都完美的通过规则来进行分类的工作,并不是机器学习的强项。表现应该是无法和传统规则相比的。

0x04 模型持久化
sklearn库中提供了joblib
joblib.dump()用于保存模型
joblib.load()用于读取模型

0x05 总结
实际上这些并没有用到数学上的知识,这不代表机器学习有多简单只是库封装的功劳,我对机器学习的理论基础还欠缺的非常多,我相信未来机器学习肯定会运用到信息安全当中,所以现在多学多练也十分有必要。

0x00 起因

暑假到目前为止,游戏玩的有点多,玩归玩,会思考的人任何时间都可以是学习的时间。

异星工厂——Factorio 是一款2D生产建设模拟游戏,在这里你需要设计并建设出不同的自动生产流水线,不断生产出愈加复杂的工业品。尽情开动你的想象力,将传送带、机械臂、组装机等简单的设备精密结合,创造出属于你自己的自动化流水生产建筑群。同时别忘了在异星虫子的威胁下保护好你的工业帝国

自动化的流水线和我们所写的软件具有高度的相似性,从游戏中的较优策略也能反向的体现在软件工程中。

0x01 动起来

在游戏中,刚出生的我们只有一个采矿机和一个石炉,优先考虑的自然是在资源丰富的地区开始我们第一步的生产,打开地图的第一眼我们就在心中有了规划,铁矿丰富就建立铁厂,岩石密布则修建采石场。
在软件中,第一步往往也会先从架构开始搭起,不同的功能先写成不同的函数,尽管函数的内容可能只有return Ture

此时我们的燃料只有我们手动砍下的树,木材烧完了再放回去,这样的效率可不够高,四处逛逛发现不远处有一片煤矿,就决定先当个煤老板了。
生活中,在我进行一些信息收集的时候,会去一些网站手动的查询,费时也费力,这时我要去写程序去做。

我们既有了资源也有了能源,接下来就是攀科技的时候了,刚开始手工生产科技点并没有发现有什么不合适的,可是到了后来各种科技点都需要数百个,手工已经满足不了我们的需求了,我们需要使用工厂来帮我们生产产品,原料的输入就全靠流水线的运输。起初工厂与原料的生产处离得非常近想着既简单又直接,但是麻烦却越来越多。
我们有了数据之后,程序需要对数据进行处理,往往为了图方便获取到数据后会直接编写处理代码忽视了低内聚高耦合的要求导致缺乏可扩展性。

0x02 更自动些

在游戏中我发现了,当我把原料处理和工厂加工两部分分开始就是一个典型的生产者消费者模型,生产线就是一种队列模型。游戏里生产线是会被堆满的,此时我们的生产者从而自动停止了生产,等待消费者消费出一个空位才开始。

在游戏中,我也会把所有原料的流水线并行在一起,由两边的工厂各取所需,是不是很像组成原理中的总线结构。

由于一开始我们并不能对我们的工厂就有完美的规划到中后期会对工厂进行大量重构,宗旨就是把各个功能独立分开,避免杂糅在一起。

0x03 杀虫子

在没有坦克之前,使用汽车加机枪去消灭虫巢往往是汽车被虫子咬爆,而在研发出坦克后,直接平推开过去虫巢就被摧毁了。不同的任务需要找到相适应的工具,多去Github上看看相关项目,自己的代码写起来也会事半功倍

0x04 最后

游戏目前也就玩到这个阶段,对于更高级的机器人的用法还不了解,最后放上目前的工厂图