基于規(guī)則評分的密碼強度檢測算法分析及實現(xiàn)(JavaScript)

簡言

用正則表達式做用戶密碼強度的通過性判定聋呢,過于簡單粗暴诡壁,不但用戶體驗差,而且用戶帳號安全性也差跪者。那么如何準(zhǔn)確評價用戶密碼的強度棵帽,保護用戶帳號安全呢?本文分析介紹了幾種基于規(guī)則評分的密碼強度檢測算法渣玲,并給出了相應(yīng)的演示程序逗概。大家可以根據(jù)自己項目安全性需要,做最適合于自己的方案選擇忘衍。

密碼強度檢測算法

1 方案1 (簡單)

方案1算法通過密碼構(gòu)成分析逾苫,結(jié)合權(quán)重分派,統(tǒng)計得出密碼強度得分枚钓。得分越高铅搓,表示密碼強度越大,也就越安全搀捷。方案1算法思想簡單星掰,實現(xiàn)容易。

1.1 方案1評分標(biāo)準(zhǔn)

一、密碼長度:

  • 5 分: 小于等于4 個字符
  • 10 分: 5 到7 字符
  • 25 分: 大于等于8 個字符

二氢烘、字母:

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

三、數(shù)字:

  • 0 分: 沒有數(shù)字
  • 10 分: 1 個數(shù)字
  • 20 分: 大于1 個數(shù)字

四播玖、符號:

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

五椎工、獎勵:

  • 2 分: 字母和數(shù)字
  • 3 分: 字母、數(shù)字和符號
  • 5 分: 大小寫字母黎棠、數(shù)字和符號

1.2 方案1等級劃分

根據(jù)密碼評分晋渺,將密碼劃分成以下7個等級:

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

該評分標(biāo)準(zhǔn)及等級劃分,實際使用時脓斩,可小做調(diào)整木西,但不建議做大的變動。

1.3 方案1演示程序

演示程序

1.4 方案1測試分析

// 評分 25随静,純小寫字母無法通過驗證
console.log("aaaaaaaa".score());
// 評分 45八千,純數(shù)字無法通過驗證
console.log("11111111".score());
// 評分 47,小寫+數(shù)字無法通過驗證
console.log("aa111111".score());
// 評分 45燎猛,小寫+大寫無法通過驗證
console.log("aaaaAAAA".score());
// 評分 50恋捆,4位密碼不可能通過驗證
console.log("11!!".score());
// 評分 70,5位密碼可通過驗證
console.log("0aA!!".score());
// 評分 67重绷,小寫+大寫+數(shù)字可通過驗證(8位)
console.log("aA000000".score());
// 評分 70沸停,數(shù)字+符號可通過驗證
console.log("000000!!".score());

從以上測試結(jié)果中,我們可以看出算法是十分的有效的昭卓,基本能夠保證密碼具有一定的安全性愤钾。但是存在的問題也很明顯,其中最主要的問題是對重復(fù)或連續(xù)的字符評分過高候醒。以測試用例中最后一個為例: 000000!! 可以得到70分能颁,但顯然并不是一個非常強壯的密碼。

另外倒淫,方案1最高可以得到95分伙菊,也就是說沒有100分(絕對安全)的密碼,這一點也是很有智慧的設(shè)計敌土。

2 方案2

針對方案1中的不足镜硕,方案2中引入了減分機制。對于重復(fù)出現(xiàn)返干,連續(xù)出現(xiàn)的字符給予適當(dāng)?shù)臏p分谦疾,以使得密碼評分更準(zhǔn)確。同時在方案2中密碼的評分基數(shù)及計算過程都十分的復(fù)雜犬金,要想理解其中每一步的含義,請保持足夠的耐心。

2.1 方案2加分項

一晚顷、密碼長度:

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

二、大寫字母:

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

三、小寫字母:

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

四、數(shù)字:

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

五捧弃、符號:

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

六、位于中間的數(shù)字或符號:

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

七嘴办、最低條件得分:

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

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

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

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

2.2 方案2減分項

一、只有字母:

  • 公式:-n眼五,其中n表示字母個數(shù)

二妆艘、只有數(shù)字:

  • 公式:-n,其中n表示數(shù)字個數(shù)

三弹砚、重復(fù)字符數(shù)(大小寫敏感):

該項描述復(fù)雜双仍,具體計算方法見如下示例程序:

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

四、連續(xù)大寫字母:

  • 公式:-(n*2)桌吃,其中n表示連續(xù)大寫字母出現(xiàn)的次數(shù)
  • 舉例:如輸入AUB朱沃,則n=2

五、連續(xù)小寫字母:

  • 公式:-(n*2)茅诱,其中n表示連續(xù)小寫字母出現(xiàn)的次數(shù)
  • 舉例:如輸入aub逗物,則n=2

六、連續(xù)數(shù)字:

  • 公式:-(n*2)瑟俭,其中n表示連續(xù)數(shù)字出現(xiàn)的次數(shù)
  • 舉例:如輸入381翎卓,則n=2

七、正序或逆序字母:

  • 公式:-(n*3)摆寄,其中n表示連續(xù)發(fā)生的次數(shù)
    • 正序或逆序是指字母表中的順序
    • 不區(qū)分大小寫
  • 條件:只有連續(xù)3個字母或以上失暴,才會減分坯门,
  • 例1:如輸入ABC,則n=1
  • 例2:如輸入dcBA逗扒,則n=2

八古戴、正序或逆序數(shù)字:

  • 公式:-(n*3),其中n表示連續(xù)發(fā)生的次數(shù)
  • 條件:只有連續(xù)3個數(shù)字或以上矩肩,才會減分
  • 例1:如輸入123现恼,則n=1,
  • 例2:如輸入4321黍檩,則n=2
  • 例3:如輸入12叉袍,則不會減分

九、正序或逆序符號:

  • 公式:-(n*3)刽酱,其中n表示連續(xù)發(fā)生的次數(shù)
  • 條件:只有連續(xù)3個符號或以上喳逛,才會減分

2.3 方案2等級劃分

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

  • >= 80: 非常強(VERY_STRONG)
  • >= 60: 強(STRONG)
  • >= 40: 好(GOOD)
  • >= 20: 弱(WEAK)
  • >= 0: 非常弱( VERY_WEAK)

2.4 方案2演示程序

演示程序

2.5 方案2測試分析

// 評分 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有了比較大的改進和提升肛跌,尤其是對連續(xù)或重復(fù)字符上表現(xiàn)出色艺配。但是方案2也存在明顯的不足,主要缺點包括對人名(Mary)衍慎、單詞(Story)转唉、鍵盤上相連的鍵(Asdf)、L33T(@dmin)沒法識別稳捆。

L33T:是指把拉丁字母換成數(shù)字或是特殊符號的書寫形式赠法。例如把E寫成3、A寫成@乔夯、to寫成2砖织、for寫成4。

3 方案3 zxcvbn

3.1 簡要說明

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

zxcvbn是一個受密碼破解啟發(fā)而來的密碼強度估算器眶熬。它通過模式匹配和保守估計,大概可以識別大約30K左右的常規(guī)密碼块请。主要基于美國人口普查數(shù)據(jù)娜氏,維基,美國電影墩新,電視流行詞以及其它一些常用模式贸弥,像日期,重復(fù)字符海渊,序列字符绵疲,鍵盤模式和L33T會話等哲鸳。

從算法的設(shè)計思想上,該方案完全秒殺基于構(gòu)成的統(tǒng)計分析方法(前兩種方法)最岗。同時zxcvbn支持多種開發(fā)語言帕胆。因其模式的復(fù)雜及字典的存在,當(dāng)前版本的zxcvbn.js大約有800多K般渡。

要了解項目的詳情及算法見zxcvbn官網(wǎng):

github zxcvbn

3.2 方案3演示程序

演示程序

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

原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驯用,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子儒老,更是在濱河造成了極大的恐慌蝴乔,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驮樊,死亡現(xiàn)場離奇詭異薇正,居然都是意外死亡,警方通過查閱死者的電腦和手機囚衔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門挖腰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人练湿,你說我怎么就攤上這事猴仑。” “怎么了肥哎?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵辽俗,是天一觀的道長。 經(jīng)常有香客問我篡诽,道長崖飘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任杈女,我火速辦了婚禮朱浴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碧信。我一直安慰自己赊琳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布砰碴。 她就那樣靜靜地躺著躏筏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呈枉。 梳的紋絲不亂的頭發(fā)上趁尼,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天埃碱,我揣著相機與錄音,去河邊找鬼酥泞。 笑死砚殿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芝囤。 我是一名探鬼主播似炎,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悯姊!你這毒婦竟也來了羡藐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤悯许,失蹤者是張志新(化名)和其女友劉穎仆嗦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體先壕,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡瘩扼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垃僚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片集绰。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冈在,靈堂內(nèi)的尸體忽然破棺而出倒慧,到底是詐尸還是另有隱情,我是刑警寧澤包券,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布纫谅,位于F島的核電站,受9級特大地震影響溅固,放射性物質(zhì)發(fā)生泄漏付秕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一侍郭、第九天 我趴在偏房一處隱蔽的房頂上張望询吴。 院中可真熱鬧,春花似錦亮元、人聲如沸猛计。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奉瘤。三九已至,卻和暖如春煮甥,著一層夾襖步出監(jiān)牢的瞬間盗温,已是汗流浹背藕赞。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卖局,地道東北人斧蜕。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像砚偶,于是被迫代替她去往敵國和親批销。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,007評論 6 13
  • 0x01 目錄 常見編碼: ASCII編碼 Base64/32/16編碼 shellcode編碼 Quoted-p...
    H0f_9閱讀 12,814評論 2 17
  • 好了蟹演,昨晚风钻,就在昨晚,我又崴腳了酒请。就在快要結(jié)束的時候,一個突破進入禁區(qū)鸣个,挑籃命中羞反,落地式踩在別人腳上,我拉個去囤萤,足...
    lj神經(jīng)刀閱讀 183評論 0 1
  • 有沒有人想過,人類最根本的認(rèn)知富雅,從什么開始的掸驱?科學(xué)背后的科學(xué)究竟是什么?邏輯從何而來?所有宗教信仰里面有沒有一些共...
    韓公_絕學(xué)課閱讀 340評論 0 0
  • 綠蔭遮蓋著天空没佑,陽光時而透過樹蔭打在車的擋風(fēng)玻璃上毕贼,就像一個孩子在逗弄你,你明可以就手抓住她蛤奢,只是不忍… ...
    那片回憶閱讀 367評論 0 0