سؤال

ما هي أفضل طريقة لضمان أن يتم توفيره من قبل المستخدم كلمة المرور كلمة مرور قوية في التسجيل أو تغيير كلمة المرور ؟

فكرة واحدة كان (في بايثون)

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
هل كانت مفيدة؟

المحلول

1:القضاء غالبا ما تستخدم كلمات السر
التحقق من إدخال كلمات السر ضد قائمة غالبا ما تستخدم كلمات السر (انظر على سبيل المثالأعلى 100.000 كلمات السر المسربة LinkedIn كلمة المرور قائمة: http://www.adeptus-mechanicus.com/codex/linkhap/combo_not.zip) ، تأكد من تضمين leetspeek التبديلات: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

فقط التالية passwordmeter لا يكفي ، لأن المؤكد به السذاجة خوارزمية يرى Password1! جيد, في حين أنه ضعيف للغاية.تأكد من أن تجاهل رأس المال الأولي الحروف عندما سجل فضلا عن زائدة الأرقام والرموز (كما في آخر 3 قواعد).

حساب شانون الكون
انظر: أسرع طريقة لحساب الكون في بايثون

3:لا تسمح أي كلمات مرور ضعيفة جدا
بدلا من إجبار المستخدم إلى الانحناء إلى هزيمة ذاتية قواعد تسمح أي شيء من شأنها أن تعطي درجة عالية بما فيه الكفاية.كيف عالية يعتمد على استخدامك القضية.

والأهم من ذلك
عند قبول كلمة المرور وتخزينها في قاعدة بيانات ، تأكد من الملح و تجزئة ذلك!.

نصائح أخرى

اعتمادا على اللغة ، وعادة ما تستخدم التعبيرات العادية للتحقق مما إذا كان لديه:

  • كبيرة واحدة على الأقل واحد حرف صغير
  • رقم واحد على الأقل
  • واحد على الأقل طابع خاص
  • بطول ستة أحرف على الأقل

يمكنك أن تطلب من كل ما سبق ، أو استخدام القوة مربع نوع من السيناريو.بالنسبة لي قوة متر, إذا كانت كلمة المرور له طول الحق ، يتم تقييمها على النحو التالي:

  • شرط واحد التقى:كلمة مرور ضعيفة
  • شرطين التقى:متوسطة المرور
  • كل الظروف اجتمعت:مرور قوية

يمكنك ضبط أعلاه لتلبية الاحتياجات الخاصة بك.

وجوه المنحى النهج مجموعة من القواعد.تعيين الوزن إلى كل حكم تكرار خلال لهم.في الزائف كود:

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;

}

اثنين من أبسط المقاييس للتحقق هي:

  1. طول.سأقول 8 أحرف كحد أدنى.
  2. عدد طابع مختلف الطبقات كلمة المرور تحتوي على.هذه هي عادة الحروف الصغيرة والحروف الكبيرة والأرقام وعلامات الترقيم والرموز الأخرى.كلمة مرور قوية تحتوي على شخصيات من ثلاثة على الأقل من هذه الفئات ، إذا فرض عدد أو غير أبجدية الحرف الذي يقلل من فعالية الهجمات القاموس.

Cracklib كبيرة في أحدث حزم هناك بيثون وحدة المتاحة لذلك.ومع ذلك ، على الأنظمة التي لا تملك مثل CentOS 5, لقد كتبت ctypes المجمع النظام cryptlib.وهذا من شأنه أيضا أن يعمل على نظام لا يمكنك تثبيت بيثون-libcrypt.ذلك لا تتطلب بيثون مع ctypes المتاحة ، وذلك CentOS 5 لديك لتثبيت واستخدام python26 الحزمة.

كما أن لديها ميزة أنها يمكن أن تأخذ اسم المستخدم وكلمة التحقق من كلمات السر التي تحتوي على أو تكون متشابهة إلى حد كبير ، مثل libcrypt "FascistGecos" وظيفة ولكن دون مطالبة المستخدم موجود في /etc/passwd.

بلدي ctypescracklib مكتبة تتوفر على جيثب

بعض الأمثلة على الاستخدامات:

>>> 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'

بعد قراءة مفيدة أخرى إجابات, هذا هو ما أنا ذاهب مع:

-1 نفس اسم المستخدم
+0 يحتوي على اسم المستخدم
+1 أكثر من 7 أحرف
+1 أكثر من 11 حرف
+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 إن لم يكن شاملة من اسم المستخدم

ربما أن هذا يسجل أقل.

هناك المفتوحة و الحرة جون السفاح تكسير كلمة السر الذي هو وسيلة رائعة للتحقق من القائمة قاعدة بيانات كلمة السر.

حسنا هذا هو ما يمكنني استخدام:

   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;
} 

بالإضافة إلى نهج موحد من خلط ألفا الرقمية والرموز, لقد لاحظت عندما كنت مسجل مع MyOpenId الأسبوع الماضي ، كلمة المرور مدقق يخبرك ما إذا كانت كلمة المرور الخاصة بك على أساس كلمة القاموس ، حتى إذا قمت بإضافة أرقام أو محل الفا مع أرقام مماثلة (باستخدام الصفر بدلا من 'o', '1' بدلا من 'أنا' ، إلخ.).

أنا معجب جدا.

كتبت جافا سكريبت صغير التطبيق.نلقي نظرة: آخر كلمة المرور متر.يمكنك تحميل المصدر واستخدامها/تعديل تحت GPL.وقد متعة!

أنا لا أعرف إذا كان أي شخص سوف تجد هذه مفيدة, ولكن أنا حقا أحب فكرة من مجموعة الأوامر كما اقترح phear فذهبت وكتب القاعدة بيثون 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

تنويه:لا وحدة اختبار

إذا كان لديك الوقت, تشغيل تكسير كلمة السر ضدها.

قوة كلمة المرور لعبة الداما ، وإذا كان لديك الوقت+الموارد (لها مبررا إلا إذا كنت يتم التحقق أكثر من بضع كلمات السر) استخدام الجداول قوس قزح.

مع سلسلة من الفحوصات للتأكد من أنه يلبي الحد الأدنى من المعايير:

  • 8 أحرف على الأقل
  • تحتوي على واحد على الأقل غير الأبجدية الرقمية رمز
  • لا يطابق أو تحتوي على اسم المستخدم/البريد الإلكتروني/الخ.
  • الخ

هنا هو البرنامج المساعد مسج أن التقارير قوة كلمة المرور (لا حاولت ذلك بنفسي):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/

ما هي أفضل طريقة لضمان أن يتم توفيره من قبل المستخدم كلمة المرور كلمة مرور قوية في التسجيل أو تغيير كلمة المرور ؟

لا تقيم تعقيد أو قوة المستخدمين سوف تجد وسيلة لخداع النظام الخاص بك أو الحصول على محبطة لدرجة أنها سوف تترك.التي سوف يحصل لك مواقف مثل هذا.فقط تتطلب بعض طول و التي تسربت كلمات السر لا تستخدم.نقاط المكافأة:تأكد من أي تطبيق يسمح باستخدام مديري كلمة السر و/أو 2FA.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top