密碼漫遊記

密碼漫遊記

總覽

今天下午,烏雲漏洞報告平台宣布網易郵箱漏洞過億數據泄漏,我去,據說有億級別的用戶密碼流出..

現在網易官方還在和烏雲互掐,真相估計還要時間,但小編反問,你的密碼設計合理嗎?

2011年起有一系列重大網站密碼泄露,csdn社區、人人網、多玩網、微博的部分密碼數據都被掛到了網上(數據請自行google,本文討論思路,展示結果,不泄露信息)。

我們以當時微博的3315156條用戶名密碼數據,開始分析之旅。

image

工具

而我們下載到的文件類似於csv(逗號分隔) 或tsv格式(空格分隔)數據,如:

mail password xxxx@yahoo.com.cn 198869 yyyy@sina.com 5201985926

數據很大,需要的查詢可能很複雜,純腳本處理很難勝任,我們需要資料庫, 本文就用mongoDB了。

我們可以在命令行里使用mongoimport命令導入數據,也可以使用腳本(我用node.js)導入,腳本更靈活。導完後,可以直接在命令行(如mac的terminal)查詢:

//密碼為1234的同學共2438個> db.passwords.count({password:1234})2438

以上,括弧裡面的叫查詢條件,這在本文中很重要,我們可以在查詢條件里插入正則表達式(網上資料大大的),讓查詢變得更複雜:

//密碼用888結尾的同學共15813個> db.passwords.count({password:{$regex:/888$/}})15813

最後,有時候我們要統計,比如密碼以a、b、c、d..,各有多少,這時我們需要用mapreduce,mapreduce可以處理很多數據,但是在mongo執行mapreduce較複雜,一般在腳本里寫好了去執行。

嘿嘿,工具只是手段,白貓黑貓,能抓老鼠的就是好貓。

啟程!

密碼top100,都有些啥

運行mapreduce,很容易跑出前100的密碼, 以下是前二十名:

很容易發現規律,俺將此類密碼的主人分五大派系:

  • 極懶派

  • 手勢派

  • 規律派

  • 手機派

  • 生日派

  • 情感派

極懶派:

這3萬多同學真是懶的令人髮指,也刷新了哥的常識,喝喝…

| 密碼| 排名 | 重複 |

| ——|:——-:| ——-:|

|0|3|27458次|

|111111|4|27328次|

|1|18|2781次|

|@163.com|51|1015次|

|password|70|755次|

|@qq.com|74|714次|

  1. 那時候微博竟然能通過一個字的密碼。

  2. password也是老外的高頻詞,我不知道是不是某些網站輸入框里password提示詞的誤導。

  3. 單字重複型,如 11111,讓我們深入發掘下。

  4. 最有意思的是163.com和@qq.com出現的頻率,而這1000多用戶,密碼=用戶名後半部分…

極懶派.一字重複n次

推廣一下,統計形如 『aa』, 『11111』, 『ssssssss』這類若干個相同單字的密碼總數。

正則表達式可以讓我們很方便地去進行查詢:

//查詢所有完全由1構成重複2次以上的密碼var query = { password:{ $regex: /^1{2,}$/ }}

我統計了 1、2、3、4、5、6、7、8、9、0、q、a、z、w、s、d的頻率分布,其中用』111111』型的用戶最多

這些密碼總計6w多人 佔2%。

極懶派.用戶名=密碼

上述統計不包含用戶名和密碼相同的密碼,這部分密碼共有多少呢?

以abcd@qq.com 為例,我們統計這3種模式的數量之和:

  • abcd@qq.com

  • abcd

  • @qq.com

99671個人,有點意外,整整佔了3%呢!

手勢派:

密碼太長,能在鍵盤上排成一種形狀,記憶成本就大大壓縮,在密碼排行榜上,和圖形有關的密碼是哪些?

123456云云者,勉強算吧,在數字鍵盤劃一字。同理qwerty開頭的也是這個原理。

| 密碼| 排名 | 重複 |

| ——|:——-:| ——-:|

|qazwsx|50|1017次|

|qwerty|67|777次|

|123qwe|78|680次|

|asdfgh|87|549次|

對此,我看到一位老外很牛逼地總結了20種模式:

這個模式很牛逼,圖上是鍵盤密碼。但11年已經有很多人用手機上微博了。有不少這種手機鍵盤,因此很多密碼為啥長也就迎刃而解了。

| 1| 2 | 3 |

| ——|:——-:| ——-:|

|4|5|6|

|7|8|9|

| 密碼| 排名 | 重複 |

| ——|:——-:| ——-:|

|147258|29|1899次|

|147258369|40|1538次|

|159357|41|1402次|

|159753|54|993次|

規律派:

記住一串數字的規律,我們就可以把一串簡單的數字演繹成複雜密碼,而你記住規則就好。

很勉強,123456就是個等差數列

fn = n

而 13579是

fn = 2*n-1

很多人會用疊詞 如123123,112233,或疊加後對稱 123321

高分密碼有這些:

| 密碼| 排名 | 重複 |

| ——|:——-:| ——-:|

|123123|6|14838次|

|112233|21|2536次|

|102030|100|484次|

可以引申下,同樣是數列,用了中學知識就不一樣啦,假設我們讓 fn = n^2, 我們就可以構造一個數列了:

1 2 3 4 5 6 -> 1 4 9 16 25 36..

我查詢了含有1491625的所有密碼,共找到30幾個,真是海內存知己(因為曾經我也是這麼設計的)

同理 1 8 27 64 125 的只有3個人,高手啊

如果你拿12345開根號、取三角函數、取對數,忘記密碼,在手機計算機里算一遍(別忘了公式)。

海內無知己,天涯只有你,你贏了!

手機派:

使用自己和親人的生日、電話、手機做密碼,已是我對普通密碼的印象了,這部分人究竟多不多?

用手機做密碼,一開始我設置了11位的數字的條件,但是有很多錯誤的結果。好在網上有對手機號碼檢測的正則表達式,包含了2013年前所有的手機欄位:

  • 移動:139 138 137 136 135 134 147 150 151 152 157 158 159 178 182 183 184 187 188

  • 聯通: 130 131 132 155 156 185 186 145 176

  • 電信: 133 153 177 180 181 189

  • 虛擬運營商:170

因此大神整理了一個可以查詢手機號的正則表達式:

//對前三位進行排查,排除所有一定不是手機號的密碼var query = { password:{ $regex: /^0?(13[0-9]|15[012356789]|17[0678]|18[0-9]|14[57])[0-9]{8}$/ }}

親測有效哦,出來的密碼幾乎都是手機號, 172418個同學用手機號做密碼 佔比5%。

生日/紀念日派:

我們查詢所有包含年份的密碼,這些年份都以19和20開頭,且有4位連續數字, 考慮到5201314(我愛你一生一世)也是高頻密碼,且密碼數據的時間為2011年,此時2013不該出現,所以排除2011年以後的年份,我們得到如下結果:

//對年份進行篩選var query = { password:{ $regex: /(19(d{2})|200[0-9]|2010|2011)/ }}

543559個密碼使用了年份,佔總量的18%。

真不是小數字,但數據還是很複雜,有大量年份和字母,符號混合的,也不一定就是年份。那我們縮小範圍,如果包含生日的有多少人?

月份比較複雜,1月1日出生的,也許寫11,也許寫0101,也有1.1、1-1的。但後者其實比較少,且在在這篇分析人人和csdn密碼的文章里看到YYMMDD型的生日是最多的:

| 日期格式| CSDN (%) | RenRen (%) |

| ——|:——-:| ——-:|

| YYMMDD| 0.14 | 3.59 |

| YYYYMMDD| 5.92(38萬) | 2.67 |

| MMDDYYYY| 0.06 | 0.11 |

| 其他| 小於0.01 | 小於0.01 |

那我們的查詢如下

//對年份進行篩選,月份位和日期位上若是0-9的數字,可以自由選擇是否加0var query = { password:{ $regex: /(19d{2}|200[0-9]|2010|2011)([1-9]|0[1-9]|11|12)(([0-2][1-9])|30|31)/ }}

318022個密碼符合條件 佔總量的10%。

這批密碼還是頗為複雜,因為很多人在字母和其他數字後加入生日的,僅以生日作為密碼的人會有多少?

//對年份進行篩選var query = { password:{ $regex: /^(19d{2}|200[0-9]|2010|2011)([1-9]|0[1-9]|11|12)(([0-2][1-9])|30|31)$/ }}

答案是137697, 4%的人用自己生日做密碼,而其中,也有些奇葩的答案,如好幾個』19190504』 我去,這是xx團委的公眾號么…

情感派:

寫一句有含義的密碼,寫什麼重複率最高?

| 密碼| 排名 | 重複 |

| ——|:——-:| ——-:|

|5201314|5|15015次|

|1314520|10|5473次|

|7758521|12|4833次|

|woaini|20|2659次|

|iloveyou|49|1054次|

情感派.因為愛情

現實里壓抑的我們難得一說我愛你,不論國內國外,都有很多人對著伺服器許願,說出 wo ai xx,這些我愛你型密碼的總數讓我非常震驚。

這份密碼數據里,woaini 以2659次重複榮居意義型密碼榜首,iloveyou則不到woaini的一半。

但事實上文字版的都弱爆了,位居第五名的5201314(我愛你一生一世)有15000個人同時使用,還有各種變體..其中第13名最缺愛 7758521(親親我吧愛我吧)

除了我愛你,我還愛誰?

讓我們查詢任何含有 woai(我愛)的密碼,還是基本都是在各種愛你.. 偶爾有woaiwojia woaishui woainima.. 有意思的是我愛我家,這中介公司的名字取得真是合理。

如果我們查詢含有 『wo』字的密碼,也會發現我最喜歡做的事情就是愛xx.. 除了愛你,我還愛誰呢,老公、老婆、媽媽、爸爸…

woailaopo + laopowoai 的人數有291人 laogongwoai和woailaogong的人數有98人,這些都是少數派密碼了。我們試試 我愛媽媽(201)和我愛爸爸(60)的比例,竟然也是3:1。

出於好奇,我又統計了密碼里包含』laopo』的和包含』laogong』的比例:

老公: 454

老婆: 1118

包含老公的密碼基本都是形如: 『zuiailaogong』、 『qinaidelaogong』、 『pplaogong』,我擦看不下去了,真是一部show恩愛寶典..

愛老婆的數量還是完勝,可惜,這是一組良莠不齊的密碼, 還是有不少形如laopo38、 laoposhizhu choulaopo laopocaolei sblaopo777 的密碼…(總數還是不算多)

相反,罵人的人比例很少,fuck shit cao說的人都不算多。而這其中,也有些有趣的點:

魯迅在雜文《論他媽的》中說他媽的是中國的國罵,但是時代變了,也許是受了上古十大神獸草泥馬(當年暴走漫畫王尼瑪還沒火吧),nima的頻率2714次遠高於tama 101次。也完勝 『fuck』、 『shit』、 『wocao』這些 400-500次之間的詞。

用什麼字做密碼最安全

我不是黑客,不知破解演算法是怎麼做的,但只要鍵入一個字,就讓你的密碼與眾不同,你會怎麼敲?

我們對密碼里用到的所有字進行統計,得出下圖

1是第一名,被300多萬用戶累計輸入300多萬次,1是一個很有趣的數字,超過60%的人密碼會用到1,而30%的人會以1作為密碼開頭,

可以看到』.』 『@』 等特殊字元,在符號里排名很靠前。曾經看到說用』『在密碼里較為安全,因為比』-『少,事實上也的確如此,但你何必按shift打號呢,』,』的比例比前面所有的標點符號都少

我們可以看到,數據下降非常快速,有規律可循嗎?將柱狀圖的大小全部取對數,那麼四大陣營的階梯形一覽無餘:

1-9排在了所有的字母之前,幾乎所有的字母排在了大寫字母之前

最後,糾正一個數據錯誤,我們看到 『E』 和 『+』 的比例非常異常,他們理應沒有那麼多,為什麼?

5.20131E+131.23456E+11

好,看到這裡,你應該覺得很熟悉, 5201314,123456, 都是熟悉的密碼,而E+13這種也很熟悉。excel里輸入一個長度超過11位的純數字,excel會自動將數字轉化為這個樣子的。這份數據應該是被誰用excel打開後又保存了,所以,大寫字母最多的應該是 『A』,而 『+』的用量也排不到符號類的第二名。

你的密碼安全嗎

回到2011年,我在微博上找一個郵箱,然後破解你的密碼,哥成功的概率有多大?

前100名的密碼,第一名的密碼123456共165882條,佔5%。前10名的密碼有316085條,佔10%,而前100條密碼共442555條,占 15%

累計15%的人能被這100個密碼破解。

用戶名和密碼匹配(包含之前提到的前綴相同,後綴相同和 後綴+@相同)共99671人。

累計計18%的用戶都會在103次窮舉後被破解。

近100年的生日有365*100個,如果我遍歷那麼多次,總有一個是對的,這樣我可以破解4%的密碼。

累計22%的人已經被破解。

倘若我知道你的手機號碼,5%的人的密碼會被破解,累計27%

如果我知道你的名字(這份數據無法分析你的名字和密碼的關係) 這個比例會更高。

2011年,1/3的人密碼是不安全的。

你覺得你的密碼設計的科學嗎?

參考資料:

ZIPF分布、PARETO分布和冪律分布

CSDN及人人網的用戶密碼分析

最新手機號碼驗證正則表達式


推薦閱讀:

在美聯航(United)飛機上使用免費Wi-Fi的探索
如何評價「流氓捆綁」軟體?
ngrok - 免費的內網穿透
細說OSI七層協議模型及OSI參考模型中的數據封裝過程?
網路小結1

TAG:安全 | 計算機網路 | 大數據 |