当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《检查密码强度的最佳方法是什么?》经验,为你挑选了2个好方法。

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

我有一个想法(在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

VirtuosiMedi.. 17

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

至少一个大写和一个小写字母

至少一个号码

至少有一个特殊字符

长度至少为六个字符

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

满足一个条件:弱密码

满足两个条件:中密码

满足所有条件:强密码

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



1> VirtuosiMedi..:

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

至少一个大写和一个小写字母

至少一个号码

至少有一个特殊字符

长度至少为六个字符

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

满足一个条件:弱密码

满足两个条件:中密码

满足所有条件:强密码

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


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

2> user9116..:

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

abstract class Rule {

    float weight;

    float calculateScore( string password );

}

计算总分:

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;

}

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

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;

}

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有