本学期WEB安全课上的一个大作业,虽做得一般(很渣),但是本着记录的目的,将本次大作业及个人所作的工作贴在这里。
大作业内容:
源数据:163,LinkedIn,Yahoo数据库泄露的密码。
要求:
1. 基础分析:包括密码构成元素分析,键盘密码模式分析,日期密码及其格式分析,拼音使用统计分析,英文单词的使用统计
2. 基于分析结果,编写口令字典生成器
3.(可选)基于分析结果,采用传统方式(PCFG/Markov)或机器学习算法对口令的安全性进行分析和评估,并编程实现。
我的任务:
识别密码库中的拼音并进行统计分析。
以上就是本次大作业内容,我采用的是Python语言,利用Pandas库中的Series,DataFrame格式以及正则表达式,进行了程序的编写与实现。
程序源代码:
https://github.com/AndyLauCD/python/blob/master/%E9%99%88%E8%BF%AA_yahoo%E6%8B%BC%E9%9F%B3%E5%88%86%E6%9E%90%E4%BB%A3%E7%A0%81_161012.py
本次大作业最主要的问题就是判断一段字符是否为拼音,主要算法参考(基本等同)下面网址下的Generic Human的回答:
http://stackoverflow.com/questions/8870261/how-to-split-text-without-spaces-into-list-of-words
这是一个非常精妙的算法,利用常用英文单词字频字典,利用加权与Zipf定律进行单词的分割。而我将字典换成了中文拼音,由于暂没有中文拼音使用词频的统计,故使用短拼音权重大于长拼音(如pin权重大于ping)进行分割,进行统计、分析。
这个本次作业的精髓所在,其也可以用在英文使用统计,但是由于时间限制,小组内其他优秀的成员做了这一部分,以后有机会我可以继续进行分析统计画图。
统计结果主要如下所示:
统计 | 163 | Yahoo | |
总密码数量 | 3727349 | 1000000 | 453492 |
总拼音数量 | 1287316 | 249107 | 89916 |
top20 | a | a | a |
wo | e | m | |
ai | m | e | |
li | ma | o | |
ni | o | ma | |
wang | ri | ri | |
xiao | mi | me | |
yu | la | mi | |
wei | li | sa | |
zhang | ka | la | |
shi | ni | er | |
yang | da | da | |
liu | na | ka | |
ma | ta | mo | |
chen | ca | ne | |
hao | le | ni | |
wu | sa | ta | |
jia | an | na | |
jian | ba | de | |
yi | mo | an |
另外,本算法存在一些中英文识别问题,比如‘a’,根据用户习惯很难判断属于单词还是字母。更有甚者,“summer”可以理解为‘su’,'m','m','er'四个中文拼音,暂时没有合适的解决办法。留待以后进行思考。