频道栏目
首页 > 安全 > 网络安全 > 正文

基于信息片断的民众密码研究

2017-09-06 09:34:42      个评论      
收藏   我要投稿

长久以来,我感到咱们所利用的密码由各个分歧的信息连续组合而成,而选用哪些信息、若何组合,这些是必要被卖力研讨的,今朝我还未看到对此有相干的较为谨严的文章,本着只管即便谨严的进修立场,我对民众密码停止了一次阐发,并在此报告我的阐发进程和论断。
别的,由于该数据并不是近期数据,和其时该网站几乎没有暗码战略的缘故原由,阐发的成果能够并不适用现下环境。
0x01 实践筹备
在这里,我将利用“暗码片断”“弱暗码片断”“弱暗码行动片断”的观点赞助本文的编写,所谓的暗码片断,指的是在一串暗码中,咱们所利用的分歧的信息片断,如hll19980606,该暗码能够分为两个暗码片断,一是姓名的缩写hll,二是其出诞辰期,两者代表了分歧的寄义。
所谓弱暗码片断,指的是大多数人在停止暗码天生的进程中经常利用到的一个字符串片断,好比由a12345 a6633 a6666 这三个暗码,咱们能够得悉,在暗码组合的进程中,咱们经常利用到a这个片断,则a便是咱们所指的弱暗码片断。
弱暗码行动片断,指的是民众常在暗码中利用的信息,比方后面提到的具备特别意义的日期光阴、个人的姓名、身份证、手机号码等分歧寄义的信息,这些信息所展示进去的暗码片断便是咱们所说的暗码行动片断,而弱暗码行动片断即人们在暗码中罕用的信息。
一般而言,暗码片断能够从字母、数字、字符三个范例的字符串来斟酌,由于繁多的信息每每采纳繁多的字符串范例来保留,好比姓名利用字母,诞辰利用数字,是以当分歧范例的字符串瓜代呈现时,其极有能够呈现了分歧的暗码片断,咱们能够据此来提取暗码片断以停止阐发。
另一方面,物以类聚,分歧的社区和集团的用户能够在暗码的利用方面会有分歧的偏向,对分歧范例的用户的暗码停止阐发,也是咱们该当斟酌的事。
对弱暗码片断、弱暗码行动片断停止统计阐发,有助于咱们更便利的预测分歧用户能够利用的暗码。
0x02 数据提取
出于数据量和数据污浊度的斟酌,本次所阐发的暗码库采纳的是网上地下传播的某数据库,数据量颠末统计达70w条,由于数据自己为sql文件,此中含有本义字符,自写法式处置起来较为费事,是以决议将其导入mysql后再格局化导出所需字段。
导出敕令相似:

mysql -uroot -ppass -e "select password from xxx.xxx" >>pass.txt
必要提示一点的是,利用上述办法导出,第一行是字段名password,别的此中的换行符为CRLF,即”\r\n”,实在与0x03内的代码不符,是以如需套用下述代码,应先将”\r\n”处置为”\n”。
亦可采纳select into outfile的方法,再也不赘述。
0x03 数据处置
数据量略大,利用图形化编辑器处置轻易形成法式假死,这里利用php的cli形式,简略写了几行代码,便利数据的提取。
重要完成的是字符串正则提取和调换,在利用的时刻按需要改动正则表达式或选择性正文,代码相似下述,PHP 5.6.27测试经由进程,能够有大批冗余代码,呈现内存用尽的正告时将$leng改小一点便可,或许能够测验考试利用相似ini_set('memory_limit',128M); 的代码,将分配给php的内存调大一点。
用法

php.exe xxx.php pass.txt
代码内容
$filename = $argv[1];
$r='_'.rand().'.txt';
$leng=1024*1024*30;
$offset=0;
for (;;){
    $length=$leng;
    //准确提取行内数据,避免一行字符只提取了部门
    for (;;){
        if (file_get_contents($filename,false,null,$offset+$length,1)==="\n" ||filesize($filename)$offset+$length) {
            break 1;
        } else{
            $length=$length>=(filesize($filename)-$offset)?filesize($filename)-$offset:$length;
            $length--;
            if($length===0)
                exit("length maybe too short");
        }
    }
    $c=file_get_contents($filename,false,null,$offset,$length);
    // // 正则提取,主动分行
    // preg_match_all('/([^\da-zA-Z]+)/mi', $c, $test);
    // foreach ($test[1] as $key => $value) {
    //  file_put_contents($filename.$r, $value."\n",FILE_APPEND);  
    // }
    // $offset+=$length;
    // if($offset>filesize($filename))
    //  break 1;
    // //正则调换
    $test=preg_replace("/\n /mi","  ",$c);
    file_put_contents($filename.$r, $test,FILE_APPEND);
    $offset+=$length;
    if($offset>=filesize($filename))
        break 1;
    //去除反复空缺行
    // $test=preg_replace("/(\n){2,}/mi","\n",$c);
    // file_put_contents($filename.$r, $test,FILE_APPEND); 
    // $offset+=$length;
    // if($offset>=filesize($filename))
    //  break 1;

}
echo $filename.$r;
?>
下述代码是我用于盘算词频的,

php.exe count.php pass.txt
代码内容
$filename = $argv[1];
$r_file=$filename.'_'.rand().'.txt';
$f=file($filename);
$f_c=array_count_values($f);
arsort($f_c);
foreach ($f_c as $key => $value) {
    file_put_contents($r_file, $value.' '.$key,FILE_APPEND);   
}
echo $r_file;
?>
其余代码迥然不同,就不供给了,暗码片断的提取进程只是一个正则的改动,再也不细述。
0x04弱暗码片断统计阐发
颠末处置,咱们从字符串范例、片断完备度两方面提取了9个文件,如下:
multi.txt_字母提取.txt_C_O.txt_20115.txt
multi.txt_字符提取.txt_C_O.txt_5327.txt
multi.txt_数字提取.txt_C_O.txt_19182.txt
字母提取.txt_C_O.txt_373.txt
字母行.txt_C_O.txt_16123.txt
字符提取.txt_C_O.txt_26830.txt
字符行.txt_C_O.txt_3954.txt
数字提取.txt_C_O.txt_15998.txt
数字行.txt_C_O.txt_5071.txt
xx行指只用作完备暗码的片断,multi.txt指不用作完备暗码的片断,xx提取指包括以上两者的片断。
上面间接利用excel天生为了可视化统计图。



到这里能够看出,该网站的用户在停止组合暗码的时刻,最罕用的片断是123,123456,1,520,.,a,qq等,他们每每以这些片断与其余信息组合。



在不停止组应时,他们更多利用的是比方123456,......,woaini这些片断,和上述片断稍有分歧



同一察看的成果根本是后面两者相加,做一个广泛的概述。
0x05 字符串范例组合环境
这里我利用了数据库,便利数据的挑选。
别的,用a代表大小写字母,0代表数字,~代表特别字符。
提取top20的组合制成统计图,环境如下。

数据成果表现,该批暗码数据中,纯数字范例的暗码高达60%(能够说是很可怕了)。
参考代码如下
$con = mysqli_connect($mysqlhost, $username, $password, $dbname)
    or die('SQL server down');
$arr=file('xxx.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($arr as $key => $value) {
    $t=preg_replace('/[a-zA-Z]+/','a',$value);
    $t=preg_replace('/\d+/','0',$t);
    $t=preg_replace('/[^\w]+/','~',$t);
    if(!$record[$t]){
        $record[$t]=1;
    }else{
        $record[$t]++;
    }
    echo $key." 1\n";
}
unset($arr);
$n=0;
foreach ($record as $key => $value) {
$n++;
    $key=addslashes($key);
    mysqli_query(
    $con,
    "INSERT passtest(string,times) VALUES('{$key}', '{$value}')"
);
echo $n."   2\n";
}
mysqli_close($con);
?>
0x06 弱暗码行动片断统计阐发
这里咱们是界说了一些行动尺度,而后依照尺度来婚配的。
然则又不能不说的是,一个片断能否属于行动片断,是比拟难经由进程简略的规矩来断定的,是以这里的阐发所展示的成果非常无限。好比一个数字能否是和用户相干的QQ账号,是不克不及简略的看数字的,还必要经由进程有用的干系库,停止更繁杂的阐发。

 


测试代码
$arr['yyyy']='/(19|20)[0-9]{2}/i';
$arr['yyyymmdd']='/(19|20)[0-9]{2}(0[1-9]{1}|1[0-2]{1})[0-3][0-9]/i';
$arr['mmdd']='/(0[1-9]{1}|1[0-2]{1})[0-3][0-9]/i';
$arr['xxxx']='/((AO|AI|OU)|([ZSC][H])|([qwertypsdfghjklzxcbnm])){2,4}/i';
$arr['x']='/((AO|AI|OU)|([ZSC][H])|([qwertypsdfghjklzxcbnm]))[aoeiuv]{1,2}[ng]{0,2}/i';
$arr['phone']='/1(3|5|7|8)\d{9}/i';
$arr['email']='/\w+@\w+\.\w+/i';
// $arr['qq']='/[1-9]\d{4,9}/i';
$f=file('xxx.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($f as $key => $value) {
    echo $key."\n";
    foreach ($arr as $key1 => $value1) {
        if(preg_match($value1,$value))
            if(!$n[$key1])
                $n[$key1]=1;
            else
                $n[$key1]++;
    }
}
echo "Now writing...\n";
foreach ($n as $key => $value) {
    file_put_contents('xxx.new.txt',$key.'  '.$value."\n",FILE_APPEND);
}
?>
0x07 修改事情
实在仔细的同伙该当斟酌到了,在0x03中采纳的是依照字符串范例来朋分片断,这是有成绩的,好比在处置如q1w2e3,hllsb,20082333,passw0rd如许的字符串,就轻易显得爱莫能助。
是以我在这里也利用了另一种办法来停止词频,疏忽字符串范例,不外仍然不完善,重要的道理便是从一切暗码中提取一切持续的m个字符,盘算词频,而后提取一切的m-1个字符,盘算词频……直到提取一切持续的3个字符,提取词频。
每次提取的持续字符数实在也便是咱们说的粒度或许精度了,由于粒度自己很难准确节制,而一般而言粒度越小,带来的信息量每每越低,像abcd,不克不及把四个字母都零丁作为片断,字符零丁作为片断每每是用于分歧范例字符的隔绝,比方a123456,xxx@xxx.xxx,而这时刻的单个字符,咱们利用0x03的办法是能够提取进去的。是以咱们该当过度节制最小粒度。
是以,当粒度过小,排行第一的字符轻易是一些无意义字符,粒度太大轻易过滤掉一些片断,另一方面,由于道理的限定,这种办法提取异常耗盘算资本。
在这里,我提取了前1w个暗码作为阐发。成果如下。

倒不是我锐意处置了字母和字符,而是提取进去的前1w暗码的样本阐发成果的确如此,实在这也相符0x04 0x05的统计成果。
不外如许的成绩也很显著,字符串23456的利用频率和3456、456频率很靠近,也便是说,实际上23456是呈现最频仍片断,而3456 456离开23456存在的环境并未几。是以还必要进一步再停止阐发。
上面是我利用的代码,在处置大批数据的时刻,如下代码就显得力有未逮了,乃至轻易呈现内存不敷的征象。
ini_set('memory_limit', '128M');
$file=$argv[1];
$a=file($file,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$max=0;
foreach ($a as $key => $value) {
    $max=$max>=strlen($value)?$max:strlen($value);
}
// $m=$max;
$m=10;
$n=0;
for (; $m>3 ; ) { //节制最小粒度
    foreach ($a as $key1 => $value1) {
        if($value1>=$m){
            $i=0;
            for(;$i+$mstrlen($value1);){
                $c=substr($value1, $i,$m);
                if($b[$c]){
                    $n=0;
                    $i++;
                    continue ;
                }
                foreach ($a as $key2 => $value2) {
                    if(stripos($value2, $c)){
                        $n++;
                    }
                }
                $b[$c]=$n;
                        $n=0;

 

                        $i++;          
                    }
        }
        echo $m.'   '.$key1."\n";
    }
    $m--;
    //echo $m."\n";
}
arsort($b);
// print_r($b);
foreach ($b as $key => $value) {
    file_put_contents($file.'_new.txt', $value.'    '.$key."\r\n",FILE_APPEND);
}
?>
0x08 能够更好的解决计划
便宜劳动力:能够利用一个较低的价钱,雇人来将这些片断给朋分进去,好比hllsb,让他在hll和sb之间加个回车,不外这显著必要一定的财力支持。
收费劳动力:像是领有大批用户的互联网公司,就能够玩这种游戏,“验证码1:中国事那一年开国的,验证码2:请将hllshabi朋分成几个有意义的片断(如xxwoaini=xx|woaini),经由进程验证码1来断定2朋分准确的几率”。不外假如真的利用的话,并不像我描写的这么简略。
能够略显简略的办法:间接界说一个预设表,预设一些罕用的片断。
能够更智能的计划:
思虑一下,咱们为何看到q1w2e3,passw0rd的时刻会晓得这不该当拆分,而看到hllsb,20082333这种却感到该当拆分?
我感到是认识度的缘故原由,qwe和123自己是一个比拟眼生的片断,在q1w2e3中,qwe和123自己距离的不远,咱们很轻易从中提掏出咱们认识的这两个片断。
而对付passw0rd,对咱们来说password是一个眼生的片断,两者实在差异不大,能够看到实在只有一个字节被调换成为了相近的0,实在就算被调换成为了passw@rd,或许调换成其余相似的字符串,咱们轻微思虑一下也是能够懂得它是由password蜕变而来的。
至于hllsb,20082333,这两者该当算是典范了,前者是由于咱们晓得sb这个片断,而hll又恰好属于声母,h属于百家姓里的姓氏的声母,能够推测出hll为人名,这都是认识度的典范代表。异样的,2008婚配了公元编年法且相符近、当代年份,2333婚配了收集用语。也便是说,认识度不只仅是详细某个字符串,还能够是婚配某种格局。
是以假如要模仿大脑的思绪,咱们能够树立一个预设表,此中字段能够是:弱暗码片断、罕用范例、收集用语、英文罕见单词、韵母表、百家姓……等等,而后将字符串停止一定的处置,而后与预设表停止婚配,假如能够高度婚配某个值或范例,那末就表现该字符串很能够是一个自力的片断,该当自力对待,假如婚配了多个值和范例,阐明该字符串该当停止切割。
对字符串停止的处置重要体如今好比如下几个方面,以上述四个字符串为例:
以上四个都是间接婚配时无奈高度婚配的,在这种环境下,该当处置后再次停止婚配。
q1w2e3:对付这种两种范例的字符串瓜代过于频仍的,单范例字符串的单位过小,过小的单位每每意味着信息量低,是以对付范例穿插频仍的字符串,能够斟酌提取繁多范例,从新朋分为qwe和123两个片断,而后分离查问预设表,假如两者中有一个高度婚配,那末全体就该当作为繁多片断对待;
passw0rd:对付这种,实在自己就与password高度婚配,能够间接查问。不外咱们晓得password自己是有意义的,这种方法能够经由进程测验考试先树立一张调换表,测验考试停止字符串调换,将调换的成果带入预设表查问。
hllsb、20082333:能够停止逆向婚配,阐发表中能否有某数据婚配了该字符串的一部门,能否又有数据婚配了字符串的残剩一部门,假如未婚配的部门较少,就能够将未婚配的部门抛弃了。
固然这个只是一个假想,完成起来还是有艰苦的。
写在末了
任何一个小的点,都能够继承深刻上来,使之成为一门学识。
至多我感到,民众暗码不只是有纯真的弱口令成绩,固然今朝也有所谓的社会工程学字典,然则字典的天生不该是纯真的信息重组,里面的信息还必要咱们卖力阐发。除本次的对付民众暗码的简略阐发,咱们每每还必要针对分歧群体和分歧的个别停止针对性的暗码阐发,以阐发出最靠近能够的用户暗码。

 

 

上一篇:【预警】勒索软件的新型传播方式:关闭Word文档后电脑就会被感染
下一篇:无弹窗入侵渗透试验研究
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训

版权所有: 红黑联盟--致力于做实用的IT技术学习网站