基於規則評分的密碼強度檢測演算法分析及實現(JavaScript)

來源:互聯網
上載者:User

標籤:JavaScript   password   前端   密碼強度   安全   

簡言

用Regex做使用者密碼強度的通過性判定,過於簡單粗暴,不但使用者體驗差,而且使用者帳號安全性也差。那麼如何準確評價使用者密碼的強度,保護使用者帳號安全呢?本文分析介紹了幾種基於規則評分的密碼強度檢測演算法,並給出了相應的示範程式。大家可以根據自己項目安全性需要,做最適合於自己的方案選擇。

1 方案1 (簡單)

方案1演算法通過密碼構成分析,結合權重指派,統計得出密碼強度得分。得分越高,表示密碼強度越大,也就越安全。方案1演算法思想簡單,實現容易。

1.1 方案1評分標準

一、密碼長度:

  • 5 分: 小於等於4 個字元
  • 10 分: 5 到7 字元
  • 25 分: 大於等於8 個字元

二、字母:

  • 0 分: 沒有字母
  • 10 分: 全都是小(大)寫字母
  • 20 分: 大小寫混合字母

三、數字:

  • 0 分: 沒有數字
  • 10 分: 1 個數字
  • 20 分: 大於1 個數字

四、符號:

  • 0 分: 沒有符號
  • 10 分: 1 個符號
  • 25 分: 大於1 個符號

五、獎勵:

  • 2 分: 字母和數字
  • 3 分: 字母、數字和符號
  • 5 分: 大小寫字母、數字和符號
1.2 方案1等級劃分

根據密碼評分,將密碼劃分成以下7個等級:

  • \>= 90: 非常安全(VERY_SECURE)
  • \>= 80: 安全(SECURE)
  • \>= 70: 非常強(VERY_STRONG)
  • \>= 60: 強(STRONG)
  • \>= 50: 一般(AVERAGE)
  • \>= 25: 弱(WEAK)
  • \>= 0: 非常弱( VERY_WEAK)

該評分標準及等級劃分,實際使用時,可小做調整,但不建議做大的變動。

1.3 方案1示範程式

示範程式

1.4 方案1測試分析
// 評分 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分(絕對安全)的密碼,這一點也是很有智慧的設計。

2 方案2

針對方案1中的不足,方案2中引入了減分機制。對於重複出現,連續出現的字元給予適當的減分,以使得密碼評分更準確。同時在方案2中密碼的評分基數及計算過程都十分的複雜,要想理解其中每一步的含義,請保持足夠的耐心。

2.1 方案2加分項

一、密碼長度:

  • 公式 :+(n*4),其中n表示密碼長度

二、大寫字母:

  • 公式:+((len-n)*2),其中n表示大寫字母個數,len表示密碼長度

三、小寫字母:

  • 公式:+((len-n)*2),其中n表示小寫字母個數,len表示密碼長度

四、數字:

  • 公式:+(n*4),其中n表示數字個數
  • 條件:滿足n < len,才能得到加分,len表示密碼長度

五、符號:

  • 公式:+(n*6),其中n表示符號個數

六、位於中間的數字或符號:

  • 公式:+(n*2),其中n表示位於中間的數字或符號個數

七、最低條件得分:

  • 公式:+(n*2),其中n表示滿足的最低條件條目數
  • 條件:只有滿足最低條件,才能得到加分

其中最低條件的條目如下:

  • 1.密碼長度不小於8位
  • 2.包含大寫字母
  • 3.包含小寫字母
  • 4.包含數字
  • 5.包含符號

最低條件要求滿足條目1並至少滿足條目2-5中的任意三條。

2.2 方案2減分項

一、只有字母:

  • 公式:-n,其中n表示字母個數

二、只有數字:

  • 公式:-n,其中n表示數字個數

三、重複字元數(大小寫敏感):

該項描述複雜,具體計算方法見如下樣本程式:

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);    }}

四、連續大寫字母:

  • 公式:-(n*2),其中n表示連續大寫字母出現的次數
  • 舉例:如輸入AUB,則n=2

五、連續小寫字母:

  • 公式:-(n*2),其中n表示連續小寫字母出現的次數
  • 舉例:如輸入aub,則n=2

六、連續數字:

  • 公式:-(n*2),其中n表示連續數字出現的次數
  • 舉例:如輸入381,則n=2

七、正序或逆序字母:

  • 公式:-(n*3),其中n表示連續發生的次數
    • 正序或逆序是指字母表中的順序
    • 不區分大小寫
  • 條件:只有連續3個字母或以上,才會減分,
  • 例1:如輸入ABC,則n=1
  • 例2:如輸入dcBA,則n=2

八、正序或逆序數字:

  • 公式:-(n*3),其中n表示連續發生的次數
  • 條件:只有連續3個數字或以上,才會減分
  • 例1:如輸入123,則n=1,
  • 例2:如輸入4321,則n=2
  • 例3:如輸入12,則不會減分

九、正序或逆序符號:

  • 公式:-(n*3),其中n表示連續發生的次數
  • 條件:只有連續3個符號或以上,才會減分
2.3 方案2等級劃分

根據密碼評分,將密碼劃分成以下5個等級:

  • \>= 80: 非常強(VERY_STRONG)
  • \>= 60: 強(STRONG)
  • \>= 40: 好(GOOD)
  • \>= 20: 弱(WEAK)
  • \>= 0: 非常弱( VERY_WEAK)
2.4 方案2示範程式

示範程式

2.5 方案2測試分析
// 評分 0console.log("11111111".score());// 評分 2console.log("aa111111".score());// 評分 38console.log("000000!!".score());// 評分 76console.log("Asdf2468".score());// 評分 76console.log("Mary2468".score());// 評分 60console.log("@dmin246".score());

從以上測試可以看出方案2較方案1有了比較大的改進和提升,尤其是對連續或重複字元上表現出色。但是方案2也存在明顯的不足,主要缺點包括對人名(Mary)、單詞(Story)、鍵盤上相連的鍵(Asdf)、L33T(@dmin)沒法識別。

L33T:是指把拉丁字母換成數字或是特殊符號的書寫形式。例如把E寫成3、A寫成@、to寫成2、for寫成4。

3 方案3 zxcvbn3.1 簡要說明

針對方案2中的不足,引入了方案3,進一步的提長密碼強度。方案3完全引入一個第三方檢驗工具zxcvbn。

zxcvbn是一個受密碼破解啟發而來的密碼強度估算器。它通過模式比對和保守估計,大概可以識別大約30K左右的常規密碼。主要基於美國人口普查資料,維基,美國電影,電視流行詞以及其它一些常用模式,像日期,重複字元,序列字元,鍵盤模式和L33T會話等。

從演算法的設計思想上,該方案完全秒殺基於構成的統計分析方法(前兩種方法)。同時zxcvbn支援多種開發語言。因其模式的複雜及字典的存在,目前的版本的zxcvbn.js大約有800多K。

要瞭解項目的詳情及演算法見zxcvbn官網:

github zxcvbn

3.2 方案3示範程式

示範程式

以上是三胖對密碼強度檢測演算法和方案的理解和分析,不足之處還請大家多多指正!

原文連結

基於規則評分的密碼強度檢測演算法分析及實現(JavaScript)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.