44

登録またはパスワード変更フォームで、ユーザーが入力したパスワードが強力なパスワードであることを確認する最善の方法は何ですか?

私が持っていた1つのアイデア(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
4

11 に答える 11

16

言語にもよりますが、私は通常、正規表現を使用して、次のものがあるかどうかを確認します。

  • 少なくとも 1 つの大文字と 1 つの小文字
  • 少なくとも 1 つの数字
  • 少なくとも 1 つの特殊文字
  • 6 文字以上の長さ

上記のすべてを要求することも、強度メーター タイプのスクリプトを使用することもできます。私の強度メーターでは、パスワードの長さが適切であれば、次のように評価されます。

  • 1 つの条件が満たされました: 脆弱なパスワード
  • 2 つの条件が満たされました: 中パスワード
  • すべての条件を満たす: 強力なパスワード

ニーズに合わせて上記を調整できます。

于 2008-09-16T18:02:24.570 に答える
10

オブジェクト指向のアプローチは一連のルールになります。各ルールに重みを割り当て、それらを繰り返します。擬似コード:

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;

}
于 2008-09-16T18:32:22.453 に答える
3

確認する最も簡単な指標は次の 2 つです。

  1. 長さ。最低でも8文字だと思います。
  2. パスワードに含まれるさまざまな文字クラスの数。これらは通常、小文字、大文字、数字、句読点、その他の記号です。強力なパスワードには、これらのクラスのうち少なくとも 3 つのクラスの文字が含まれます。数字またはその他の非アルファベット文字を強制すると、辞書攻撃の有効性が大幅に低下します。
于 2008-09-16T18:04:19.760 に答える
2

他の役立つ答えを読んだ後、これは私が行っていることです:

-1ユーザー名と同じ
+0にはユーザー名
+1が含まれます7文字
以上+111文字以上
+1には数字が含まれます
+1小文字と大文字の組み合わせ
+1には句読点が含まれます+1
印刷できない文字

pwscore.py:

import re
import string
max_score = 6
def score(username,passwd):
    if passwd == username:
        return -1
    if username in passwd:
        return 0
    score = 0
    if len(passwd) > 7:
        score+=1
    if len(passwd) > 11:
        score+=1
    if re.search('\d+',passwd):
        score+=1
    if re.search('[a-z]',passwd) and re.search('[A-Z]',passwd):
        score+=1
    if len([x for x in passwd if x in string.punctuation]) > 0:
        score+=1
    if len([x for x in passwd if x not in string.printable]) > 0:
        score+=1
    return score

使用例:

import pwscore
    score = pwscore(username,passwd)
    if score < 3:
        return "weak password (score=" 
             + str(score) + "/"
             + str(pwscore.max_score)
             + "), try again."

おそらく最も効率的ではありませんが、合理的なようです。FascistCheck=>'ユーザー名に似すぎている'が価値があるかどうかわからない。

'abc123ABC!@£'=ユーザー名のスーパーセットでない場合はスコア6/6

多分それはより低いスコアになるはずです。

于 2010-11-28T19:55:31.107 に答える
2

Cracklib は優れており、新しいパッケージには Python モジュールが用意されています。ただし、CentOS 5 など、まだそれがないシステムでは、システム cryptlib 用の ctypes ラッパーを作成しました。これは、python-libcrypt をインストールできないシステムでも機能します。ctypes が利用可能な python必要なので、CentOS 5 では python26 パッケージをインストールして使用する必要があります。

また、libcrypt の「FascistGecos」関数のように、ユーザー名を取得して、それを含むパスワードまたは実質的に類似したパスワードをチェックできるという利点もありますが、ユーザーが /etc/passwd に存在する必要はありません。

私のctypescracklib ライブラリは github で入手できます

いくつかの使用例:

>>> FascistCheck('jafo1234', 'jafo')
'it is based on your username'
>>> FascistCheck('myofaj123', 'jafo')
'it is based on your username'
>>> FascistCheck('jxayfoxo', 'jafo')
'it is too similar to your username'
>>> FascistCheck('cretse')
'it is based on a dictionary word'
于 2010-11-16T04:05:10.447 に答える
1

これは私が使用するものです:

   var getStrength = function (passwd) {
    intScore = 0;
    intScore = (intScore + passwd.length);
    if (passwd.match(/[a-z]/)) {
        intScore = (intScore + 1);
    }
    if (passwd.match(/[A-Z]/)) {
        intScore = (intScore + 5);
    }
    if (passwd.match(/\d+/)) {
        intScore = (intScore + 5);
    }
    if (passwd.match(/(\d.*\d)/)) {
        intScore = (intScore + 5);
    }
    if (passwd.match(/[!,@#$%^&*?_~]/)) {
        intScore = (intScore + 5);
    }
    if (passwd.match(/([!,@#$%^&*?_~].*[!,@#$%^&*?_~])/)) {
        intScore = (intScore + 5);
    }
    if (passwd.match(/[a-z]/) && passwd.match(/[A-Z]/)) {
        intScore = (intScore + 2);
    }
    if (passwd.match(/\d/) && passwd.match(/\D/)) {
        intScore = (intScore + 2);
    }
    if (passwd.match(/[a-z]/) && passwd.match(/[A-Z]/) && passwd.match(/\d/) && passwd.match(/[!,@#$%^&*?_~]/)) {
        intScore = (intScore + 2);
    }
    return intScore;
} 
于 2011-09-02T15:02:49.987 に答える
0

誰かがこれを役に立つと思うかどうかはわかりませんが、phear によって提案されたルールセットのアイデアが本当に好きだったので、Python 2.6 クラスのルールを作成しました (ただし、おそらく 2.5 と互換性があります)。

import re

class SecurityException(Exception):
    pass

class Rule:
    """Creates a rule to evaluate against a string.
    Rules can be regex patterns or a boolean returning function.
    Whether a rule is inclusive or exclusive is decided by the sign
    of the weight. Positive weights are inclusive, negative weights are
    exclusive. 


    Call score() to return either 0 or the weight if the rule 
    is fufilled. 

    Raises a SecurityException if a required rule is violated.
    """

    def __init__(self,rule,weight=1,required=False,name=u"The Unnamed Rule"):
        try:
            getattr(rule,"__call__")
        except AttributeError:
            self.rule = re.compile(rule) # If a regex, compile
        else:
            self.rule = rule  # Otherwise it's a function and it should be scored using it

        if weight == 0:
            return ValueError(u"Weights can not be 0")

        self.weight = weight
        self.required = required
        self.name = name

    def exclusive(self):
        return self.weight < 0
    def inclusive(self):
        return self.weight >= 0
    exclusive = property(exclusive)
    inclusive = property(inclusive)

    def _score_regex(self,password):
        match = self.rule.search(password)
        if match is None:
            if self.exclusive: # didn't match an exclusive rule
                return self.weight
            elif self.inclusive and self.required: # didn't match on a required inclusive rule
                raise SecurityException(u"Violation of Rule: %s by input \"%s\"" % (self.name.title(), password))
            elif self.inclusive and not self.required:
                return 0
        else:
            if self.inclusive:
                return self.weight
            elif self.exclusive and self.required:
                raise SecurityException(u"Violation of Rule: %s by input \"%s\"" % (self.name,password))
            elif self.exclusive and not self.required:
                return 0

        return 0

    def score(self,password):
        try:
            getattr(self.rule,"__call__")
        except AttributeError:
            return self._score_regex(password)
        else:
            return self.rule(password) * self.weight

    def __unicode__(self):
        return u"%s (%i)" % (self.name.title(), self.weight)

    def __str__(self):
        return self.__unicode__()

誰かがこれが役立つことを願っています!

使用例:

rules = [ Rule("^foobar",weight=20,required=True,name=u"The Fubared Rule"), ]
try:
    score = 0
    for rule in rules:
        score += rule.score()
except SecurityException e:
    print e 
else:
    print score

免責事項: 単体テストは行っていません

于 2009-12-09T09:00:01.137 に答える
-1

パスワード強度チェッカー、および時間とリソースがある場合 (複数のパスワードをチェックする場合にのみ正当化されます)、Rainbow Tables を使用します。

于 2008-09-16T17:58:12.800 に答える
-1

一連のチェックを行って、最低限の基準を満たしていることを確認します。

  • 少なくとも 8 文字の長さ
  • 英数字以外の記号を少なくとも 1 つ含む
  • ユーザー名/電子メールなどと一致しないか、含まれていません。

これは、パスワードの強度を報告する jQuery プラグインです (自分で試したわけではありません): http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/

そして同じものが PHP に移植されました: http://www.alixaxel.com/wordpress/2007/06/09/php-password-strength-algorithm/

于 2008-09-16T17:58:28.370 に答える