it-swarm-eu.dev

Jaký je nejlepší způsob, jak zkontrolovat sílu hesla?

Jaký je nejlepší způsob, jak zajistit, aby heslo dodané uživatelem bylo silné heslo v registračním formuláři nebo ve formuláři pro změnu hesla?

Jeden nápad, který jsem měl (v pythonu)

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
42
Ed L

1: удалить часто используемые пароли
Проверьте введенные пароли по списку часто используемых паролей (см, Например, верхние 100 000 паролей ¢ утечке списка паролей LinkedIn:. http://www.adeptus-mechanicus.com/codex/linkhap/ combo_not .Zip ), обязательно включите подстановки leetspeek : A @, E3, B8, S5 a т. д.
Удалите части пароля, попавшие в этот список, из введенной фразы, прежде чем переходить к части 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 правилам).

Расчет энтропии Шеннона
См.: Самый быстрый способ вычисления энтропии в Python

3: не допускайте слишком слабых паролей
Вместо того, чтобы заставлять пользователя подчиняться саморазрушительным правилам, разрешите все,  Как высоко зависит от вашего варианта использования.

И самое главное
Когда вы принимаете пароль и сохраняете его в базе данных, не забудьте засолить и хешировать его! .

4
Johan

V závislosti na jazyce obvykle používám regulární výrazy ke kontrole, zda má:

  • Nejméně jedno velké a jedno Malé písmeno
  • Nejméně jedno číslo
  • Nejméně jeden speciální znak
  • Délka nejméně šesti znaků

Můžete požadovat všechny výše uvedené funkce nebo použít skript typu silometru. Má-li heslo správný délku, je pro můj měřič síly vyhodnoceno následovně:

  • Jedna podmínka splněna: slabé heslo
  • Byly splněny dvě podmínky: střední heslo
  • Všechny podmínky splněny: silné heslo

Výše uvedené nastavení můžete přizpůsobit vašim potřebám.

18
VirtuosiMedia

Objektově orientovaný přístup by byl souborem pravidel. Přiřaďte každému pravidlu váhu a opakujte jím. V kódu psuedo:

abstract class Rule {

    float weight;

    float calculateScore( string password );

}

Výpočet celkového skóre:

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;

}

Příklad algoritmu pravidla, založený na počtu přítomných tříd znaků:

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;

}
9
user9116

Dvě nejjednodušší metriky ke kontrole jsou:

  1. Délka. Řekl bych, že minimálně 8 znaků.
  2. Počet různých tříd znaků, které heslo obsahuje. Obvykle se jedná o malá písmena, velká písmena, číslice a interpunkční znaménka a další symboly. Silné heslo bude obsahovat znaky alespoň tří z těchto tříd; pokud vynutíte číslo nebo jiný nealfabetický znak, výrazně snížíte efektivitu slovníkových útoků.
3
Dave Webb

Cracklib je skvělý a v novějších balíčcích je k dispozici modul Python. Nicméně, na systémech, které to ještě nemají, jako je CentOS 5, jsem napsal Cypes wrapper pro systém cryptlib. To by také fungovalo na systému, který nelze nainstalovat python-libcrypt. Je does vyžadují python s dostupnými ctypy, takže pro CentOS 5 musíte nainstalovat a používat balíček python26.

Má také tu výhodu, že může mít uživatelské jméno a zkontrolovat hesla, která je obsahují nebo jsou v podstatě podobná, jako je funkce "FascistGecos" libcrypt, ale bez nutnosti, aby uživatel existoval v/etc/passwd.

Moje ctypescracklib knihovna je k dispozici na github

Některé příklady používají:

>>> 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'
2
Sean Reifschneider

po přečtení dalších užitečných odpovědí, to je to, co jdu s:

-1 stejné jako uživatelské jméno
+ 0 obsahuje uživatelské jméno
+ 1 více než 7 znaků
+ 1 více než 11 znaků
+ 1 obsahuje číslice
+ 1 kombinace malých a velkých písmen
+ 1 obsahuje interpunkci
+ 1 netisknutelný znak 

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

příklad použití:

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

pravděpodobně nejúčinnější, ale zdá se být rozumné. není jisté, že FascistCheck => 'příliš podobná uživatelskému jménu' je za to.

'abc123ABC! @ £' = skóre 6/6, pokud ne nadmnožina uživatelského jména

možná by to mělo být nižší.

2
siznax

Tam je otevřený a volný John Ripper heslo cracker, který je skvělý způsob, jak zkontrolovat existující databázi hesel.

1
tante

To je to, co používám:

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

Napsal jsem malou aplikaci Javascript. Podívejte se: Další měřič hesla . Zdroj si můžete stáhnout a použít/upravit pod GPL. Bavte se!

0
ReneS

Nevím, jestli to někdo najde, ale opravdu se mi líbila myšlenka sady pravidel, kterou navrhl phear, takže jsem šel a napsal pravidlo Python 2.6 (i když je to pravděpodobně kompatibilní s 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__()

Doufám, že to někdo najde užitečné!

Příklad použití:

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

ODMÍTNUTÍ: Není testováno

0
SapphireSun

Kromě standardního přístupu míchání alfa, číslic a symbolů jsem si všiml, že když jsem se minulý týden registroval u MyOpenId, kontrola hesel vám řekne, zda je vaše heslo založeno na slovníku Word, i když přidáváte čísla nebo nahrazujete alfa podobnými čísly. (místo nuly místo 'o', '1' místo 'i' atd.).

Byl jsem docela ohromen.

0
Steve Morgan