昔我往矣

CSDN数据库密码整理

2012年02月25日

最近很多网站的用户数据库都泄漏出来了,看来需要加强密码保护才行啊,前两天得到一份CSDN的用户数据库,应该可以做出一份强大的密码攻击字典吧。这份密码文件一共6428632行,287238395字节(273.9MB)。

说一下想法和思路,首先从文件中提取出密码字段,然后统计各个密码重复的次数,并按从高到底排序,最后进行去重。

第一步:截取密码字段

这份数据库文件的内容都是按照 account # password # 123@email.com 这样的格式。

time sh -c 'cut -f 3 -d " " csdnpasswd > cut.pass'

这条命令的作用是将csdnpasswd文件中的第三个字段截取出来,设置分隔符为“ ”(空格),把结果存放到cut.pass文件里面,
并记录命令完成所花费的时间。运行的结果如下:

real    0m27.795s                    <== 实际使用时间(real time)
user    0m1.764s                     <== 用户态使用时间(the process spent in user mode)
sys    0m15.421s                     <==内核态使用时间(the process spent in kernel mode)

ls -l cut.pass一下,文件已经缩小到67211985字节,即64.1MB,大小为原来的23.4%,行数还是一样的六百多万行。

第二步:按密码重复的次数降序排列

接下来,对cut.pass文件进行排序,去重,这里要走一点弯路,要先把cut.pass文件排序,,然后去重并记录下每一个密码的重复次数,然后按重复的次数进行排序,并去掉记录下的次数着一个字段。

使用如下命令进行去重并标记密码出现的次数

sort cut.pass | uniq -c > pass.times

使用cat pass.times | wc -l 可以发现,现在的文件pass.times文件已经只剩下4036971行了。并且每一行的格式都变成times password 即出现次数和实际的密码。

如果使用time sh -c来查看的话,可以得到如下的结果,一共是1分多钟的时间,当然这和系统条件有关系,我是在虚拟机里面运行的。

real    1m14.886s
user    0m46.775s
sys    0m14.353s

第三步:按第一个字段对文件进行再一次的排序

使用如下命令:

sort -nr -k1 pass.times > pass.times.sort

将pass.times文件的第一个字段,按降序排列,并将结果输入到pass.times.sort文件中。

上面的命令中,n代表依数字大小排序,r代表是降序,k1代表按第一个字段(如果是k2,则按第二个字段)。使用head pass.times.sort可以看到结果如下:

235025 123456789
212750 12345678
76346 11111111

显示使用频率最高的密码是123456789,有235025个帐号在使用。单从它的长度来看,确实可以抵御字典攻击了。呵呵。提醒大家不要使用以上的三个密码了,哈!!!

第四步:提取密码
既然已经把它们按出现的频率排序过了,接下来就再把密码提出来  次就ok了。

cat pass.times.sort | awk ‘{print $2}’ > password.dict

现在得到的这一个password.dict文件,就是最后所得到的密码字典文件。

如果对Bash命令十分熟悉的话,当然可以很容易直接写一个Bash脚本,一步搞定。

从得到的数据来看,Bash的命令效率实很高的。假如是一般的冒泡或者其他排序算法,其复杂度应该为O(n*n),在最坏的情况下,这份密码文件操作10 的13次方数量级。基本上实不太现实的。而这份无序的文件最多只要不到两分钟就完成了,而且是在一台配置不高的虚拟机ubuntu里面,可见,Bash指 令的算法都是十分高效率的。

当前暂无评论 »

添加新评论 »