是否存在检查密码强度的现有算法?还是重新发明轮子?

时间:2015-09-07 13:02:12

标签: passwords password-policy password-checker

我一直在考虑开发一个Android应用程序,它将告诉用户输入密码的密码强度。

在检查密码强度方面,我开发了这些 2算法来检查它。但我正在考虑使用这些算法,因为我觉得它不高效。 你们觉得怎么样?

以下是我的2种算法:

平均法

Sample input = Password12@

1. Count the lowercase, uppercase, digits and special characters in the given String.
   Eg.
   Lowercase count = 7;
   Uppercase count = 1;
   Digits count = 2;
   SpecialCharacter count = 1;

2. Get the character count and multiply it to the size of given String.
   Eg.
    (Count * Size)
    (7 * 10) = 70
    (1 * 10) = 10
    (2 * 10) = 20
    (1 * 10) = 10

3. Add the following results
   Eg.
    70 + 10 + 20 + 10 = 110

4. Get the results which is the password strength.
   Eg.
    The password is 110% strong.

积分法

Sample input = Password12@

1. Set the points such that for every:
    Lowercase = 1 point given
    Uppercase = 5 points given
    Digits = 10 points given
    Special Character = 15 points given

2. Count the lowercase, uppercase, digits and special characters in the given String.
   Eg.
   Lowercase count = 7;
   Uppercase count = 1;
   Digits count = 2;
   SpecialCharacter count = 1;

3. Get the character count and add it to the given point and multiply the size of the given String.
   Eg.
    (Count + Point) * size
    (7 + 1) * 10 = 80;
    (1 + 5) * 10 = 60;
    (2 + 10) * 10 = 120;
    (1 + 15) * 10 = 160;

4. Add the following results and divide it to the size of given String and divide it by 4.
   Eg.
    //4 because count={uppercase, lowercase, digits, special character}
    80 + 60 + 120 + 160 = 420
    420 / 4 = 105

5. Get the result which is the pswword strength.
   Eg.
   The password strength is 105%.

我的问题是:

  • 哪种算法表明有更好的实现?

  • 如果2个给定的算法效率低下,是否存在可用于检查给定密码强度的现有算法。不是这样,重新发明轮子。

2 个答案:

答案 0 :(得分:2)

指向开源密码强度检查器的链接:

https://github.com/dropbox/zxcvbn

我没有使用它,只是在谷歌上找到它,检查出来。

您的算法似乎无法很好地完成工作。

第一个可以表示为字符数n ^ 2,字符种类没有区别。

第二个是类似的,它仍然意味着你输入什么样的字符作为点只在等式中构成一个常数项: (d + 10)* 10 = d * 10 + 100(数字)。它不是更好,它只是显示更大的分数。

两种算法都产生一个大约是密码长度的平方的数字,而破坏它的时间(或强度)更多地取决于长度的指数。

从恐怖编码中查看此文章:http://blog.codinghorror.com/your-password-is-too-damn-short/

打破随机密码的时间(来自文章):

  
      
  • 9个字符2分钟
  •   
  • 10个字符2小时
  •   
  • 11个字符6天
  •   
  • 12个字符1年
  •   
  • 13个字符64年
  •   
     

random.org生成器只有""大写,小写和数字

答案 1 :(得分:1)

在检查密码强度时,两种算法都存在一些固有问题:

第一种算法基本上只计算密码的长度并乘以10.使用此算法的密码" passwordpassword"将得到160%的评级。对于这么简单的密码来说太强大了。

第二种算法有点复杂,并根据字符的类型使用权重。但是使用这个算法,密码" 1234"会得到100%的评级。我确信这不是你想要的。

一般的经验法则是根据规则列表测试密码强度,然后对这些规则进行加权(以及密码实际执行的规则数量):

  • 密码必须至少8个字符(10分)
  • 密码必须包含至少一个小写字母(5分)
  • 密码必须包含至少一个大写字母(5分)
  • 密码必须至少包含一个数字(5分)
  • 密码必须包含至少一个符号(10分)
  • 密码必须包含至少5个唯一字符(5分)

然后,您可以添加一起强制执行的规则,并将该数字乘以强制执行的规则数乘以权重。 E.g:

" 1234" =(5)+ 1 * 10 = 15

"密码" =(5 + 5)+ 2 * 10 = 30

"密码1" =(5 + 5 + 5)+ 3 * 10 = 45

" password1234" =(5 + 5 + 5 + 10)+ 4 * 10 = 65

" Password1234" =(5 + 5 + 5 + 5 + 10)+ 5 * 10 = 80

" PASSW @ rd1234" =(5 + 5 + 5 + 5 + 10 + 10)+ 6 * 10 = 100

这只是基于规则的方法如何工作的简单表述。就个人而言,我会权衡指数使用的规则数量,并且有各种各样的规则。基本上,满足的规则越多,密码越复杂,它就越安全。