近來在筆者所參與的一款產品中涉及到口令安全的功能設計,其中一項功能是有關於口令強度的。在設計該功能過程當中勢必涉及到口令強度的劃分設計,怎樣的口令纔算是低強度的,怎樣的口令纔算是高強度的?目前諸多的Web系統註冊功能中的口令強度設計及劃分也無統一標準,更有甚者是直接根據口令長度來設計的口令強度劃分。html
若是要評判一則口令是強是弱,就必須先考慮影響口令強度的因素:複雜性和長度,由於咱們在輸入口令時只有這兩種維度的選擇:要麼多輸入一些特殊字符加強複雜性,要麼多輸入一些混合字符/字母增長口令長度。在不考慮拖庫、社工等口令獲取方式的前提條件下,一般狀況下,破解口令僅有暴力破解的方式能夠選擇,其中亦包括字典攻擊和彩虹表破解。安全
在純粹的暴力破解中,攻擊者須要逐一長度地嘗試口令可能組合的方式,是ATM機般的純數字組合,仍是12306般的純數字字母組合,亦或是正常電商那般能夠混合輸入數字、字母和特殊字符。假設一則口令P的長度是L,可選擇的組合形式範圍的長度是S,那麼即使是在「暴力破解」這種殘暴字眼的手段中,運氣很差的狀況下仍然須要最多嘗試SL次。口令是否安全的原則取決於攻擊者可否在可容忍的時間內破解出真實口令,而是否有耐心進行暴力破解每每決定於攻擊者的目的及成效:一名僅爲破解電子書小說壓縮包的宅男不大可能會浪費一天以上時間等待口令的「出現」。網絡
既然暴力破解須要嘗試最多達SL次方能破解出口令,那麼破解口令的速度便是破解成效的約束條件。在許多狀況下,破解速度取決於CPU運算的能力,但更多時候攻擊者面臨的是聯網破解甚至口令系統設計者的種種防禦手段,這時網絡、I/O、運算能力甚至系統防禦措施都必須考慮在破解速度以內。現在許多電子郵箱的防口令破解的措施是限制在一段時間內僅能嘗試爲數很少的幾回登錄,若考慮到相似的措施,相信口令破解的速度絕對會讓你更加失望!dom
在比特幣挖礦都須要專業礦機,高配GPU的時代,口令的破解天然不會延續使用以往原始的CPU運算。一年前的如今,來自Stricture商業諮詢公司的Jeremi Gosney公佈了他們用一組GPU集羣暴力破解密碼的成果:jsp
普通的MD5加速破解速度達到每秒1800億次,SHA1的破解速度達到630億次/秒,NTLM的破解速度達到3480億次/秒,LM加密的破解速度也有200億次/秒。
因而可知,口令的強度正隨着運算能力的逐漸提高而下降,10年前的高強度口令或許對於今天的GPU集羣破解已然能夠被視爲「不堪一擊」。在不考慮UNICODE編碼中電腦鍵盤未標明的特殊字符,在構建口令時,咱們一般可選擇的組合範圍是:編碼
數字:0~9 共10位
字母:a~z A~Z 共52位
特殊字符:「 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~」 不包含兩邊引號共33位(其中包含空格)
若是咱們將SL看成口令強度的評測標準,顯而易見,在口令長度相同的狀況下,咱們可選擇的組合方式和範圍內越大則口令強度越強,即S越大,SL的值越大。加密
另外一方面,在可選擇的組合方式和範圍有限的狀況下,口令長度越長則口令強度越強,即L越大,SL的值越大。spa
因爲SL是指數級的增加,因此口令的高複雜度並不意味着口令的高強度,好比:16位純數字的口令的組合方式有1.0e+16種,而8位數字/字母/特殊字符混合口令的組合方式僅約爲6.634e+15種,從暴力破解的難度上看,前者比後者要高出一個數量級。.net
鑑於當前GPU的運算能力愈來愈強大,筆者在設計口令強度的劃分時不得不參考上文中的GPU集羣破解速度,上文中所提到的GPU集羣暴力破解速度最低也達到百億次每秒,故以100億次/秒的破解速度爲參考,並假設破解時間不足一天的口令即爲低強度,超出一天但不滿一年爲中等強度,超出一年爲高強度,儘管在這種假設的前提下某些低強度口令在常規運算能力下仍然可被看成高強度口令。在不一樣的口令組合狀況下,不一樣口令強度的口令長度範圍以下所示:設計
組合方式及範圍 低等強度 中等強度 高等強度 純數字(10位) >0 && <15(位) >=15(位) && <18(位) >=18(位) 純字母(52位) >0 && <9(位) >=9(位) && <11(位) >=11(位) 純特殊字符(33位) >0 && <10(位) >=10(位) && <12(位) >=12(位) 數字+字母組合(62位) >0 && <9(位) ==9(位) >=10(位) 數字+特殊字符組合(43位) >0 && <10(位) ==10(位) >=11(位) 字母+特殊字符組合(85位) >0 && <8(位) >=8(位) && <10(位) >=10(位) 數字+字母+特殊字符組合(95位) >0 && <8(位) ==8(位) >=9(位)
上表亦可做爲設置強口令時的參考。如相關報道中所稱,若使用Jeremi Gosney的GPU集羣,6-8位的口令「在暴力破解面前幾乎沒法倖免」。
下面再來看看微軟的「密碼檢查器」,從該頁面檢測口令強度的JS腳本中能夠輕鬆看到其口令強度的劃分標準:
口令長度小於8位:Weak
口令長度大於等於8位:Medium
口令長度大於等於14位:Strong
口令長度大於等於14位且包含數字、大小寫字母及特殊字符:Best
以及IBM旗下Lotus Domino的口令強度劃分:口令安全性等級,或者能夠在這裏檢測本身的口令強度及破解時間。
彩虹表是一種特殊的字典,由已作加密的密碼構成,經過與系統中加密的口令對比來探測明文口令。而彩虹表的構成多數狀況下亦是由程序自動生成,儘管數據量龐大,但依然是根據弱口令或窮舉口令組合加密而造成,此外也包括人工添加的已知明文/密文的彩虹表數據。
所以,彩虹表破解及弱口令猜想終究是爲了減少破解口令的範圍,從而節省破解時間,能夠將彩虹表及弱口令想象成爲一個龐大的散狀分佈的點圖,越是遠離聚焦點的口令就會有越小的概率被包含在彩虹表/弱口令中。
因而可知,口令強度不只僅須要考慮複雜度和長度,設定口令時的奇葩程度也影響着口令安全,就像女人不但願撞衫,安全的口令也不但願雷同。