Vyhledávání na webu

javascript - Ověření hesla s postupnými písmeny a čísly - RegEx


Aby byly zákaznické účty bezpečnější, je dobrým zvykem používat dobře vytvořené heslo. Toto je můj regulární výraz pro ověřování hesel.

/^(?=.*[0-9])(?!.*?\d{3})(?=.*[a-zA-Z])(?!.*?[a-zA-Z]{3})(?=.*[~!@#$%^&*()+-?])([a-zA-Z0-9~!@#$%^&*()+-?]{8,})$/

Reprezentuje :

  • 8 nebo více znaků.
  • Velké písmeno A-Z
  • Malá písmena a-z
  • Speciální znaky ~!@#$%^&*()+-?
  • K čemu je tato funkce regulárního výrazu?: Nesmí obsahovat až 3 po sobě jdoucí písmena a/nebo čísla.

Mít čísla a/nebo písmena v pořadí 3 nebo více za sebou není v pořádku.

Příklad :

Ne OK=efg123!$, abcd567%, xyz789^&, #hijk23456
OK=ryiiu562@, erty745#, gjnfl45566^

Děkuji

Odpověď č. 1

Neznám žádný způsob, jak to udělat pomocí RegEx, ale zde je naivní funkcionální přístup.

Nejprve projděte řetězec v cyklu a porovnejte každý znak s následujícími dvěma znaky přidáním +1 a +2 k aktuálnímu indexu a vhodným způsobem je porovnejte.

Za druhé, projděte řetězec znovu a porovnejte další dva znaky s aktuálním znakem, abyste zjistili, zda jsou za sebou jdoucí.

Pokud oba cykly nedokážou najít po sobě jdoucí znaky, funkce vrátí true, jinak vrátí false.

První čtyři vrací false (neúspěch), zatímco poslední tři vrací true (úspěch).

function test(s) {
    // Check for sequential numerical characters
    for(var i in s) 
        if (+s[+i+1] == +s[i]+1 && 
            +s[+i+2] == +s[i]+2) return false;
    // Check for sequential alphabetical characters
    for(var i in s) 
        if (String.fromCharCode(s.charCodeAt(i)+1) == s[+i+1] && 
            String.fromCharCode(s.charCodeAt(i)+2) == s[+i+2]) return false;
    return true;
}

// For demo purposes only
var tests = [
    'efg123!$',
    'abcd567%',
    'xyz789^&',
    '#hijk23456',
    'ryiiu562@',
    'erty745#',
    'gjnfl45566^'
], sep = '\t\u2192 ', out = ['Fail','Pass'], eol = '<br>';
document.write('<pre>');
for(var i in tests) document.write(tests[i] + sep + out[+test(tests[i])] + eol);
document.write('</pre>');

Odpověď č. 2

Tento balíček je přesně pro to: https://github.com/zxcvbn-ts/zxcvbn

zxcvbn je odhadovač síly hesla inspirovaný nástroji pro prolomení hesel. Prostřednictvím porovnávání vzorů a konzervativního odhadu rozpoznává a hodnotí 40 tisíc běžných hesel, běžná jména a příjmení, populární slova z Wikipedie a běžná slova z různých jazyků z různých zemí a další běžné vzory jako data, opakování (aaa), sekvence (abcd), klávesnicové vzory (qwertyuiop) a l33t jazyk.

Zvažte použití zxcvbn jako algoritmické alternativy k politice složení hesel — je bezpečnější, flexibilnější a použitelnější, když weby vyžadují minimální skóre složitosti místo otravných pravidel jako „hesla musí obsahovat tři z {malá písmena, velká písmena, čísla, symboly}“.

Bezpečnější: zásady často selhávají oběma směry, umožňují slabá hesla (P@ssword1) a současně zakazují silná hesla. Flexibilnější: zxcvbn umožňuje rozmanitost stylů hesel, pokud detekuje dostatečnou složitost — fráze jsou hodnoceny vysoko, pokud obsahují dostatek neobvyklých slov, klávesové vzory jsou hodnoceny podle délky a počtu změn směru, a velká písmena přidávají složitost, pokud jsou nepředvídatelná. Snazší použití: zxcvbn je navržen pro jednoduché, bezpravidelné rozhraní, které poskytuje okamžitou zpětnou vazbu. Kromě odhadu síly obsahuje zxcvbn minimální, cílenou slovní zpětnou vazbu, která může pomoci uživatelům směrovat se k méně odhadnutelným heslům. Pro další podrobnosti a motivaci, prosím, odkazujte na článek a prezentaci USENIX Security '16.

Tento balíček také poskytuje zpětnou vazbu o tom, jak posílit heslo, a můžete nastavit požadovanou úroveň hesla.

Pokud si regulární výrazy píšete sami, musíte dávat pozor na ReDoS, a pravděpodobně ani všechno nepokryjete...