用正則表達式作用戶密碼強度的經過性斷定,過於簡單粗暴,不但用戶體驗差,並且用戶賬號安全性也差。那麼如何準確評價用戶密碼的強度,保護用戶賬號安全呢?本文分析介紹了幾種基於規則評分的密碼強度檢測算法,並給出了相應的演示程序。你們能夠根據本身項目安全性須要,作最適合於本身的方案選擇。javascript
方案1算法經過密碼構成分析,結合權重分派,統計得出密碼強度得分。得分越高,表示密碼強度越大,也就越安全。方案1算法思想簡單,實現容易。java
1、密碼長度:git
2、字母:github
3、數字:正則表達式
4、符號:算法
5、獎勵:安全
根據密碼評分,將密碼劃分紅如下7個等級:工具
該評分標準及等級劃分,實際使用時,可小作調整,但不建議作大的變更。測試
演示程序spa
// 評分 25,純小寫字母沒法經過驗證 console.log("aaaaaaaa".score()); // 評分 45,純數字沒法經過驗證 console.log("11111111".score()); // 評分 47,小寫+數字沒法經過驗證 console.log("aa111111".score()); // 評分 45,小寫+大寫沒法經過驗證 console.log("aaaaAAAA".score()); // 評分 50,4位密碼不可能經過驗證 console.log("11!!".score()); // 評分 70,5位密碼可經過驗證 console.log("0aA!!".score()); // 評分 67,小寫+大寫+數字可經過驗證(8位) console.log("aA000000".score()); // 評分 70,數字+符號可經過驗證 console.log("000000!!".score());
從以上測試結果中,咱們能夠看出算法是十分的有效的,基本可以保證密碼具備必定的安全性。可是存在的問題也很明顯,其中最主要的問題是對重複或連續的字符評分太高。以測試用例中最後一個爲例: 000000!!
能夠獲得70分,但顯然並非一個很是強壯的密碼。
另外,方案1最高能夠獲得95分,也就是說沒有100分(絕對安全)的密碼,這一點也是頗有智慧的設計。
針對方案1中的不足,方案2中引入了減分機制。對於重複出現,連續出現的字符給予適當的減分,以使得密碼評分更準確。同時在方案2中密碼的評分基數及計算過程都十分的複雜,要想理解其中每一步的含義,請保持足夠的耐心。
1、密碼長度:
2、大寫字母:
3、小寫字母:
4、數字:
5、符號:
6、位於中間的數字或符號:
7、最低條件得分:
其中最低條件的條目以下:
最低條件要求知足條目1並至少知足條目2-5中的任意三條。
1、只有字母:
2、只有數字:
3、重複字符數(大小寫敏感):
該項描述複雜,具體計算方法見以下示例程序:
var pass = "1111aaDD"; //示意密碼 var repChar = 0; var repCharBonus = 0; //得分 var len = pass.length; for(var i = 0; i < len; i++) { var exists = false; for (var j = 0; j < len; j++) { if (pass[i] == pass[j] && i != j) { exists = true; repCharBonus += Math.abs(len/(j-i)); } } if (exists) { repChar++; var unqChar = len - repChar; repCharBonus = (unqChar) ? Math.ceil(repCharBonus/unqChar) : Math.ceil(repCharBonus); } }
4、連續大寫字母:
5、連續小寫字母:
6、連續數字:
7、正序或逆序字母:
公式:-(n*3),其中n表示連續發生的次數
8、正序或逆序數字:
9、正序或逆序符號:
根據密碼評分,將密碼劃分紅如下5個等級:
// 評分 0 console.log("11111111".score()); // 評分 2 console.log("aa111111".score()); // 評分 38 console.log("000000!!".score()); // 評分 76 console.log("Asdf2468".score()); // 評分 76 console.log("Mary2468".score()); // 評分 60 console.log("@dmin246".score());
從以上測試能夠看出方案2較方案1有了比較大的改進和提高,尤爲是對連續或重複字符上表現出色。可是方案2也存在明顯的不足,主要缺點包括對人名(Mary)、單詞(Story)、鍵盤上相連的鍵(Asdf)、L33T(@dmin)無法識別。
L33T:是指把拉丁字母換成數字或是特殊符號的書寫形式。例如把E寫成三、A寫成@、to寫成二、for寫成4。
針對方案2中的不足,引入了方案3,進一步的提長密碼強度。方案3徹底引入一個第三方檢驗工具zxcvbn。
zxcvbn是一個受密碼破解啓發而來的密碼強度估算器。它經過模式匹配和保守估計,大概能夠識別大約30K左右的常規密碼。主要基於美國人口普查數據,維基,美國電影,電視流行詞以及其它一些經常使用模式,像日期,重複字符,序列字符,鍵盤模式和L33T會話等。
從算法的設計思想上,該方案徹底秒殺基於構成的統計分析方法(前兩種方法)。同時zxcvbn支持多種開發語言。因其模式的複雜及字典的存在,當前版本的zxcvbn.js大約有800多K。
要了解項目的詳情及算法見zxcvbn官網:
以上是三胖對密碼強度檢測算法和方案的理解和分析,不足之處還請你們多多指正!