检查密码强度的最佳方法是什么?

Ed *_*d L 43 security passwords algorithm

在注册或更改密码表单中,确保用户提供密码的最佳方法是什么?

我有一个想法(在python中)

def validate_password(passwd):
    conditions_met = 0
    conditions_total = 3
    if len(passwd) >= 6: 
        if passwd.lower() != passwd: conditions_met += 1
        if len([x for x in passwd if x.isdigit()]) > 0: conditions_met += 1
        if len([x for x in passwd if not x.isalnum()]) > 0: conditions_met += 1
    result = False
    print conditions_met
    if conditions_met >= 2: result = True
    return result
Run Code Online (Sandbox Code Playgroud)

Vir*_*dia 17

根据语言,我通常使用正则表达式来检查它是否具有:

  • 至少一个大写和一个小写字母
  • 至少一个号码
  • 至少有一个特殊字符
  • 长度至少为六个字符

您可以要求以上所有,或使用强度计类型的脚本.对于我的力量计,如果密码长度合适,则评估如下:

  • 满足一个条件:弱密码
  • 满足两个条件:中密码
  • 满足所有条件:强密码

您可以调整以上内容以满足您的需求.

  • 如果可能的话,我会避免使用任意系统来任意强加此处定义的大部分或全部指标.对于设计密码强度检查程序的任何人,请记住,您的一些用户已经从pass*word*s演变为传递*phrase*s.我的一次性密码长度为38个字符,全部小写,并且有170位熵.即使是我们这个星球上最快的超级计算机,太阳也会在它破裂之前燃尽.相比之下,桌面PC需要大约15分钟才能破解满足上述要求的密码. (38认同)
  • 因此,通过这个定义,"密码"或"秘密"或"123456"将具有中等强度.完善. (11认同)
  • 我还想澄清一下:向用户建议上述指标并使用强度计是完全可以接受的 - 只是不要强迫我勾选所需字符类型的列表.[它不会使我的密码更安全,只会让它更难记住](http://xkcd.com/936/).另外,不要将我限制为8或12或16个字符 - 无论如何你应该存储密码哈希,所以我的实际密码的长度是无关紧要的; 使用SHA1哈希六个字符的密码和600个字符的密码短语,每次都会在100%的时间内产生40个字符的哈希值. (8认同)
  • diceware算法(http://world.std.com/~reinhold/diceware.html)除了最后一个("A长度至少为六个字符")之外没有这些,但是用6个字的密码有77位的熵 - 相当可敬. (4认同)

use*_*116 10

面向对象的方法是一组规则.为每个规则分配权重并迭代它们.在伪代码中:

abstract class Rule {

    float weight;

    float calculateScore( string password );

}
Run Code Online (Sandbox Code Playgroud)

计算总分:

float getPasswordStrength( string password ) {     

    float totalWeight = 0.0f;
    float totalScore  = 0.0f;

    foreach ( rule in rules ) {

       totalWeight += weight;
       totalScore  += rule.calculateScore( password ) * rule.weight;

    }

    return (totalScore / totalWeight) / rules.count;

}
Run Code Online (Sandbox Code Playgroud)

一个示例规则算法,基于存在的字符类数量:

float calculateScore( string password ) {

    float score = 0.0f;

    // NUMBER_CLASS is a constant char array { '0', '1', '2', ... }
    if ( password.contains( NUMBER_CLASS ) )
        score += 1.0f;

    if ( password.contains( UPPERCASE_CLASS ) )
        score += 1.0f;

    if ( password.contains( LOWERCASE_CLASS ) )
        score += 1.0f;

    // Sub rule as private method
    if ( containsPunctuation( password ) )
        score += 1.0f;

    return score / 4.0f;

}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 7

1:消除常用
密码对照常用密码列表检查输入的密码(例如,参见泄露的 LinkedIn 密码列表中的前 100.000 个密码:http : //www.adeptus-mechanicus.com/codex/linkhap/combo_not.zip ),请确保包含leetpeek 替换:A@、E3、B8、S5 等。
在转到下面的第 2 部分之前,从输入的短语中删除与此列表匹配的部分密码。

2:不要对用户强加任何规则

密码的黄金法则是越长越好。
忘记强制使用大写、数字和符号,因为(绝大多数)用户会: - 将第一个字母设为大写;- 把数字1放在最后;-!如果需要符号,则在其后放一个。

而是检查密码强度

有关体面的起点,请参阅:http : //www.passwordmeter.com/

我建议至少遵循以下规则:

Additions (better passwords)
-----------------------------
- Number of Characters              Flat       +(n*4)   
- Uppercase Letters                 Cond/Incr  +((len-n)*2)     
- Lowercase Letters                 Cond/Incr  +((len-n)*2)     
- Numbers                           Cond       +(n*4)   
- Symbols                           Flat       +(n*6)
- Middle Numbers or Symbols         Flat       +(n*2)   
- Shannon Entropy                   Complex    *EntropyScore

Deductions (worse passwords)
----------------------------- 
- Letters Only                      Flat       -n   
- Numbers Only                      Flat       -(n*16)  
- Repeat Chars (Case Insensitive)   Complex    -    
- Consecutive Uppercase Letters     Flat       -(n*2)   
- Consecutive Lowercase Letters     Flat       -(n*2)   
- Consecutive Numbers               Flat       -(n*2)   
- Sequential Letters (3+)           Flat       -(n*3)   
- Sequential Numbers (3+)           Flat       -(n*3)   
- Sequential Symbols (3+)           Flat       -(n*3)
- Repeated words                    Complex    -       
- Only 1st char is uppercase        Flat       -n
- Last (non symbol) char is number  Flat       -n
- Only last char is symbol          Flat       -n
Run Code Online (Sandbox Code Playgroud)

仅仅关注密码表是不够的,因为它的幼稚算法肯定Password1!是好的,而它却异常薄弱。确保在评分时忽略首字母大写以及尾随数字和符号(根据最后 3 条规则)。

计算香农熵
请参阅:在 Python 中计算熵的最快方法

3:不允许任何太弱的密码
与其强迫用户屈服于自欺欺人的规则,不如允许任何能够给出足够高分数的密码。多高取决于您的用例。

最重要的是,
当您接受密码并将其存储在数据库中时,请确保对其进行加盐和散列!.