基于规则评分的密码强度检测算法分析及实现(JavaScript)

  

简言

  

用正则表达式做用户密码强度的通过性判定,过于简单粗暴,不但用户体验差,而且用户帐号安全性也差。那么如何准确评价用户密码的强度,保护用户帐号安全呢?本文分析介绍了几种基于规则评分的密码强度检测算法,并给出了相应的演示程序。大家可以根据自己项目安全性需要,做最适合于自己的方案选择。

  

基于规则评分的密码强度检测算法分析及实现(JavaScript)

  

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:安全(安全)   <李> \祝辞=70:非常强(VERY_STRONG)   <李> \祝辞=60:强(强)   <李> \祝辞=50:一般(平均)   <李> \祝辞=25:弱(弱)   <李> \祝辞=0:非常弱(VERY_WEAK)   
  

该评分标准及等级划分,实际使用时,可小做调整,但不建议做大的变动。

  

1.3方案1演示程序

  

演示程序

  

1.4方案1测试分析

  
 <=坝镅詊avascript代码类>//评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 (“0 aa !”.score ());//评67分,小写+大写+数字可通过验证(8位)
  console.log (aA000000 .score ());//评70分,数字+符号可通过验证
  console.log(“000000年!”.score());  
  

从以上测试结果中,我们可以看出算法是十分的有效的,基本能够保证密码具有一定的安全性。但是存在的问题也很明显,其中最主要的问题是对重复或连续的字符评分过高。以测试用例中最后一个为例:<代码> 000000 ! !>   

另外,方案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 & lt;兰,才能得到加分,len表示密码长度   
  

五、符号:

  
      <李>公式:+ (n * 6),其中n表示符号个数   
  

六、位于中间的数字或符号:

  
      <李>公式:+ (n * 2),其中n表示位于中间的数字或符号个数   
  

七、最低条件得分:

基于规则评分的密码强度检测算法分析及实现(JavaScript)