Sprievodca po Passay

1. Úvod

V dnešnej dobe má väčšina webových aplikácií svoju politiku hesiel - ktorá je, zjednodušene povedané, vytvorená tak, aby prinútila používateľov vytvárať ťažko prekonateľné heslá.

Na generovanie takýchto hesiel alebo na ich overenie môžeme použiť knižnicu Passay.

2. Závislosť od Maven

Ak chceme v našom projekte použiť knižnicu Passay, je potrebné pridať do našej nasledujúcej závislosti pom.xml:

 org.passay passay 1.3.1 

Nájdeme ho tu.

3. Validácia hesla

Overenie hesla je jednou z dvoch hlavných funkcií, ktoré poskytuje knižnica Passay. Je to jednoduché a intuitívne. Poďme to objaviť.

3.1. HesloDáta

Na overenie nášho hesla by sme mali použiť HesloDáta. Je to kontajner informácií, ktoré sú potrebné na overenie. Môže ukladať tieto údaje ako:

  • heslo
  • používateľské meno
  • zoznam referencií na heslo
  • pôvodu

Vlastnosti hesla a používateľského mena sa vysvetľujú. Passay knižnica nám dáva Historická referencia a ZdrojReferencia ktoré môžeme pridať do zoznamu referencií na heslo.

V poli pôvodu môžeme uchovávať informácie o tom, či bolo heslo vygenerované alebo definované používateľom.

3.2. PasswordValidator

Mali by sme vedieť, že to potrebujeme HesloDáta a PasswordValidator objekty na začatie overovania hesiel. Už sme diskutovali HesloDáta. Poďme tvoriť PasswordValidator teraz.

Najskôr by sme mali definovať súbor pravidiel pre overenie hesla. Musíme ich odovzdať konštruktorovi pri vytváraní a PasswordValidator objekt:

PasswordValidator passwordValidator = nový PasswordValidator (nové LengthRule (5));

Existujú dva spôsoby, ako odovzdať naše heslo a HesloDáta objekt. Prejdeme ho buď konštruktoru, alebo nastavovacej metóde:

PasswordData passwordData = nové PasswordData ("1234"); PasswordData passwordData2 = nové PasswordData (); passwordData.setPassword ("1234");

Svoje heslo môžeme overiť volaním potvrdiť() metóda na PasswordValidator:

RuleResult validate = passwordValidator.validate (passwordData);

Vo výsledku dostaneme a RuleResult objekt.

3.3. RuleResult

RuleResult obsahuje zaujímavé informácie o procese validácie. Vyplýva to z výsledku potvrdiť() metóda.

Najskôr nám môže povedať, či je heslo platné:

Assert.assertEquals (false, validate.isValid ());

Ďalej sa môžeme dozvedieť, aké chyby sa vrátia, keď je heslo neplatné. Chybové kódy a popisy validácie sú uchovávané v RuleResultDetail:

RuleResultDetail ruleResultDetail = validate.getDetails (). Get (0); Assert.assertEquals ("TOO_SHORT", ruleResultDetail.getErrorCode ()); Assert.assertEquals (5, ruleResultDetail.getParameters (). Get ("minimumLength")); Assert.assertEquals (5, ruleResultDetail.getParameters (). Get ("maximumLength"));

Na záver môžeme preskúmať metadáta overenia hesla pomocou RuleResultMetadata:

Celé číslo lengthCount = overiť .getMetadata () .getCounts () .get (RuleResultMetadata.CountCategory.Length); Assert.assertEquals (Integer.valueOf (4), lengthCount);

4. Generovanie hesla

Okrem validácie Passay knižnica nám umožňuje generovať heslá. Môžeme poskytnúť pravidlá, ktoré by mal generátor používať.

Na vygenerovanie hesla musíme mať Generátor hesiel objekt. Keď to máme, hovoríme generatePassword () metóda a zoznam preukazov Pravidlá znakov. Tu je ukážka kódu:

Číslice CharacterRule = nové CharacterRule (EnglishCharacterData.Digit); PasswordGenerator passwordGenerator = nový PasswordGenerator (); Reťazec heslo = hesloGenerator.generatePassword (10, číslic); Assert.assertTrue (password.length () == 10); Assert.assertTrue (containsOnlyCharactersFromSet (heslo, "0123456789"));

Mali by sme vedieť, že potrebujeme predmet CharacterData tvoriť CharacterRule. Ďalším zaujímavým faktom je, že nás knižnica poskytuje EnglishCharacterData. Je to enum piatich sád znakov:

  • číslice
  • malá anglická abeceda
  • veľká anglická abeceda
  • kombinácia malých a veľkých súborov
  • špeciálne znaky

Nič nám však nemôže zabrániť v tom, aby sme definovali našu množinu znakov. Je to také jednoduché ako implementácia CharacterData rozhranie. Pozrime sa, ako to dokážeme:

CharacterRule specialCharacterRule = new CharacterRule (new CharacterData () {@Override public String getErrorCode () {return "SAMPLE_ERROR_CODE";} @Override public String getCharacters () {return "[email protected] #";}}); PasswordGenerator passwordGenerator = nový PasswordGenerator (); Reťazec heslo = hesloGenerator.generatePassword (10, specialCharacterRule); Assert.assertTrue (containsOnlyCharactersFromSet (heslo, "[chránené e-mailom] #"));

5. Pravidlá pre pozitívne zhody

Už sme sa naučili, ako môžeme generovať a overovať heslá. Aby sme to dosiahli, musíme definovať súbor pravidiel. Z tohto dôvodu by sme mali vedieť, že v systéme sú k dispozícii dva typy pravidiel Passay: pravidlá pozitívneho párovania a pravidlá negatívneho párovania.

Po prvé, poďme zistiť, aké sú pozitívne pravidlá a ako ich môžeme použiť.

Pravidlá pozitívneho priraďovania prijímajú heslá, ktoré obsahujú poskytnuté znaky, regulárne výrazy alebo zapadajú do niektorých obmedzení.

Existuje šesť pravidiel pozitívnej zhody:

  • AllowedCharacterRule - definuje všetky znaky, ktoré musí heslo obsahovať
  • AllowedRegexRule - definuje regulárny výraz, ktorému sa heslo musí zhodovať
  • CharacterRule - definuje znakovú sadu a minimálny počet znakov, ktoré by mali byť súčasťou hesla
  • LengthRule - definuje minimálnu dĺžku hesla
  • CharacterCharacteristicsRule - skontroluje, či je heslo v poriadku N stanovených pravidiel.
  • LengthComplexityRule - umožňuje nám definovať rôzne pravidlá pre rôzne dĺžky hesiel

5.1. Jednoduché pravidlá pre kladné zhody

Teraz sa budeme venovať všetkým pravidlám, ktoré majú jednoduchú konfiguráciu. Definujú množinu legálnych znakov alebo vzorov alebo prijateľnú dĺžku hesla.

Tu je krátky príklad diskutovaných pravidiel:

PasswordValidator passwordValidator = nové PasswordValidator (nové AllowedCharacterRule (nové char [] {'a', 'b', 'c'})), nové CharacterRule (EnglishCharacterData.LowerCase, 5), nové LengthRule (8, 10)); RuleResult validate = passwordValidator.validate (new PasswordData ("12abc")); assertFalse (validate.isValid ()); assertEquals ("ALLOWED_CHAR: {legalCharacter = 1, matchBehavior = contains}", getDetail (overiť, 0)); assertEquals ("ALLOWED_CHAR: {legalCharacter = 2, matchBehavior = contains}", getDetail (overiť, 1)); assertEquals ("TOO_SHORT: {minimumLength = 8, maximumLength = 10}", getDetail (validate, 4));

Vidíme, že každé pravidlo nám poskytuje jasné vysvetlenie, ak heslo nie je platné. Existujú oznámenia, že heslo je príliš krátke a má dva nelegálne znaky. Tiež si môžeme všimnúť, že heslo sa nezhoduje s poskytnutým regulárnym výrazom.

Sme navyše informovaní, že obsahuje nedostatočné malé písmená.

5.2. CharacterCharacterisitcsRule

CharcterCharacterisitcsRule je zložitejšia ako pravidlá prezentované predtým. Ak chcete vytvoriť CharcterCharacterisitcsRule objektu, musíme poskytnúť zoznam CharacterRules. A čo viac, musíme nastaviť, koľko z nich sa musí heslo zhodovať. Môžeme to urobiť takto:

CharacterCharacteristicsRule characterCharacteristicsRule = nové CharacterCharacteristicsRule (3, nové CharacterRule (EnglishCharacterData.LowerCase, 5), nové CharacterRule (EnglishCharacterData.UpperCase, 5), nové CharacterRule (EnglishCharacterData.Digit), nové CharacterRule (EnglishCharacterData.Special);

Prezentované CharacterCharacteristicsRule vyžaduje heslo, aby obsahovalo tri zo štyroch poskytnutých pravidiel.

5.3. LengthComplexityRule

Na druhej strane, Passay knižnica nám poskytuje LengthComplexityRule. Umožňuje nám definovať, ktoré pravidlá by sa mali použiť na heslo s takou dĺžkou. Na rozdiel od CharacterCharacteristicsRule, umožňujú nám používať všetky druhy pravidiel - nielen CharacterRule.

Poďme analyzovať príklad:

LengthComplexityRule lengthComplexityRule = nové LengthComplexityRule (); lengthComplexityRule.addRules ("[1,5]", nové CharacterRule (EnglishCharacterData.LowerCase, 5)); lengthComplexityRule.addRules ("[6,10]", new AllowedCharacterRule (new char [] {'a', 'b', 'c', 'd'}));

Ako vidíme pre heslo s jedným až piatimi znakmi, podáme žiadosť CharacterRule. Ale pri hesle obsahujúcom šesť až desať znakov chceme, aby sa heslo zhodovalo AllowedCharacterRule.

6. Pravidlá pre vylučujúce zhody

Na rozdiel od pravidiel pozitívnej zhody pravidlá negatívnej zhody odmietajú heslá, ktoré obsahujú poskytnuté znaky, regulárne výrazy, položky atď.

Poďme zistiť, aké sú pravidlá negatívnej zhody:

  • Pravidlo IllegalCharacter - definuje všetky znaky, ktoré heslo nesmie obsahovať
  • Pravidlo IllegalRegex - definuje regulárny výraz, ktorý sa nesmie zhodovať
  • IllegalSequenceRule - skontroluje, či heslo nemá neplatnú postupnosť znakov
  • NumberRangeRule - definuje rozsah čísel, ktoré heslo nesmie obsahovať
  • Pravidlo medzery - skontroluje, či heslo obsahuje medzery
  • DictionaryRule - kontroluje, či sa heslo rovná ľubovoľnému slovníkovému záznamu
  • DictionarySubstringRule - skontroluje, či heslo obsahuje nejaký slovníkový záznam
  • HistoryRule - skontroluje, či heslo obsahuje historický odkaz na heslo
  • DigestHistoryRule - skontroluje, či heslo obsahuje nejaký natrávený historický odkaz na heslo
  • Pravidlo zdroja - skontroluje, či heslo obsahuje odkaz na zdrojové heslo
  • DigestSourceRule - skontroluje, či heslo obsahuje odkaz na heslo zdroja zdroja
  • UsernameRule - kontroluje, či heslo obsahuje užívateľské meno
  • RepeatCharacterRegexRule - kontroluje, či heslo obsahuje opakované ASCII znakov

6.1. Jednoduché pravidlá pre vylučujúce zhody

Najskôr sa pozrieme na to, ako môžeme použiť jednoduché pravidlá ako napr Pravidlo IllegalCharacter, Pravidlo IllegalRegexTu je krátky príklad:

PasswordValidator passwordValidator = nový PasswordValidator (nový IllegalCharacterRule (nový znak [] {'a'}), nový NumberRangeRule (1, 10), nový WhitespaceRule ()); RuleResult validate = passwordValidator.validate (new PasswordData ("abcd22")); assertFalse (validate.isValid ()); assertEquals ("ILLEGAL_CHAR: {legalCharacter = a, matchBehavior = contains}", getDetail (validate, 0)); assertEquals ("ILLEGAL_NUMBER_RANGE: {number = 2, matchBehavior = contains}", getDetail (validate, 4)); assertEquals ("ILLEGAL_WHITESPACE: {whitespaceCharacter =, matchBehavior = contains}", getDetail (validate, 5));

Príklad nám ukazuje, ako popísané pravidlá fungujú. Podobne ako pravidlá pozitívneho priraďovania, poskytujú nám úplnú spätnú väzbu o validácii.

6.2. Pravidlá slovníka

Čo ak chceme skontrolovať, či sa heslo nerovná zadaným slovám.

Z tohto dôvodu Passay knižnica nám na to poskytuje vynikajúce nástroje. Poďme objaviť DictionaryRule a DictionarySubstringRule:

WordListDictionary wordListDictionary = nový WordListDictionary (nový ArrayWordList (nový reťazec [] {"bar", "foobar"}))); DictionaryRule dictionaryRule = nový DictionaryRule (wordListDictionary); DictionarySubstringRule dictionarySubstringRule = nový DictionarySubstringRule (wordListDictionary);

Vidíme, že pravidlá slovníka nám umožňujú poskytnúť zoznam zakázaných slov. Je prospešné, keď máme zoznam najbežnejších alebo najľahšie zlomiteľných hesiel. Je preto rozumné zakázať používateľom ich používanie.

V reálnom živote by sme určite načítali zoznam slov z textového súboru alebo databázy. V takom prípade môžeme použiť Zoznamy slov. Má tri preťažené metódy, ktoré berú pole Čitateľs a vytvárať ArrayWordList.

6.3. HistoryRule a Pravidlo zdroja

Ďalej Passay knižnica nám dáva HistoryRule a Pravidlo zdroja. Môžu overiť heslá na základe historických hesiel alebo textového obsahu z rôznych zdrojov.

Pozrime sa na príklad:

SourceRule sourceRule = nové SourceRule (); HistoryRule historyRule = nové HistoryRule (); PasswordData passwordData = nové PasswordData ("123"); passwordData.setPasswordReferences (nové PasswordData.SourceReference ("zdroj", "heslo"), nové PasswordData.HistoricalReference ("12345")); PasswordValidator passwordValidator = nový PasswordValidator (historyRule, sourceRule);

Pravidlá histórie pomôžte nám skontrolovať, či už bolo heslo použité predtým. Pretože takéto postupy nie sú bezpečné, nechceme, aby používatelia používali staré heslá.

Na druhej strane, Pravidlo zdroja umožňuje nám skontrolovať, či sa heslo líši od hesla uvedeného v Zdrojové referencie. Môžeme sa vyhnúť riziku, že budete mať rovnaké heslá v rôznych systémoch alebo aplikáciách.

Za zmienku stojí, že existujú také pravidlá ako DigestSourceRule a DigestHistoryRule. Budeme sa im venovať v nasledujúcom odseku.

6.4. Pravidlá trávenia

V Passay knižnica: DigestHistoryRule a DigestSourceRule. Pravidlá súhrnu sú určené na prácu s heslami uloženými ako súhrn alebo hash. Preto je potrebné ich definovať EncodingHashBean objekt.

Pozrime sa, ako sa to deje:

Zoznam historicalReferences = Arrays.asList (new PasswordData.HistoricalReference ("SHA256", "2e4551de804e27aacf20f9df5be3e8cd384ed64488b21ab079fb58e8c90068ab")); EncodingHashBean encodingHashBean = nový EncodingHashBean (nový CodecSpec ("Base64"), nový DigestSpec ("SHA256"), 1, false); 

Tentokrát tvoríme Historická referencia štítkom a zakódovaným heslom do konštruktora. Potom sme vytvorili inštanciu EncodingHashBean so správnym algoritmom kodek a digest.

Ďalej môžeme určiť počet iterácií a to, či je algoritmus solený.

Keď už máme kódovací fazuľu, môžeme overiť naše súhrnné heslo:

PasswordData passwordData = nové PasswordData („príklad!“); passwordData.setPasswordReferences (historicalReferences); PasswordValidator passwordValidator = nové PasswordValidator (nové DigestHistoryRule (encodingHashBean)); RuleResult validate = passwordValidator.validate (passwordData); Assert.assertTrue (validate.isValid ());

Môžeme sa dozvedieť viac o EncodingHashinBean na webovej stránke Cryptacular library.

6.5. RepeatCharacterRegexRule

Ďalším zaujímavým overovacím pravidlom je RepeatCharacterRegexRule. Môžeme ho použiť na kontrolu toho, či heslo obsahuje opakovanie ASCII znakov.

Tu je ukážka kódu:

PasswordValidator passwordValidator = nové PasswordValidator (nové RepeatCharacterRegexRule (3)); RuleResult validate = passwordValidator.validate (new PasswordData ("aaabbb")); assertFalse (validate.isValid ()); assertEquals ("ILLEGAL_MATCH: {match = aaa, pattern = ([^ \ x00 - \ x1F]) \ 1 {2}}", getDetail (overiť, 0));

6.6. UsernameRule

Posledné pravidlo, o ktorom sa budeme v tejto kapitole baviť, je UsernameRule. Umožňuje nám to zakázať používať meno používateľa v hesle.

Ako sme sa už predtým dozvedeli, mali by sme si používateľské meno uložiť HesloDáta:

PasswordValidator passwordValidator = nový PasswordValidator (nové UsernameRule ()); PasswordData passwordData = nové PasswordData ("testuser1234"); passwordData.setUsername ("testuser"); RuleResult validate = passwordValidator.validate (passwordData); assertFalse (validate.isValid ()); assertEquals ("ILLEGAL_USERNAME: {username = testuser, matchBehavior = contains}", getDetail (validate, 0));

7. Prispôsobené správy

Passay knižnica nám umožňuje prispôsobiť správy vrátené overovacími pravidlami. Najskôr by sme mali definovať správy a priradiť ich k chybovým kódom.

Môžeme ich vložiť do jednoduchého súboru. Pozrime sa, aké ľahké to je:

TOO_LONG = Heslo nesmie mať viac znakov ako% 2 $ s. TOO_SHORT = Heslo nesmie obsahovať menej znakov ako% 2 $ s.

Keď máme správy, musíme tento súbor načítať. Nakoniec to môžeme prejsť do PasswordValidator objekt.

Tu je ukážka kódu:

URL zdroj = this.getClass (). GetClassLoader (). GetResource ("messages.properties"); Vlastnosti rekvizity = nové Vlastnosti (); props.load (nový FileInputStream (resource.getPath ())); MessageResolver resolver = nový PropertiesMessageResolver (rekvizity); 

Ako vidíme, načítali sme message.properties súbor a vložil do Vlastnosti objekt. Potom môžeme použiť Vlastnosti objekt na vytvorenie PropertiesMessageResolver.

Pozrime sa na príklad použitia rezolvera správ:

PasswordValidator validator = nový PasswordValidator (resolver, nové LengthRule (8, 16), nové WhitespaceRule ()); RuleResult tooShort = validator.validate (new PasswordData ("XXXX")); RuleResult tooLong = validator.validate (new PasswordData ("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ")); Assert.assertEquals ("Heslo nesmie obsahovať menej znakov ako 16.", validator.getMessages (tooShort) .get (0)); Assert.assertEquals ("Heslo nesmie mať viac znakov ako 16.", validator.getMessages (tooLong) .get (0));

Príklad jasne ukazuje, že všetky chybové kódy môžeme preložiť pomocou validátora vybaveného prekladačom správ.

8. Záver

V tomto tutoriáli sme sa naučili, ako používať Passay knižnica. Analyzovali sme niekoľko príkladov toho, ako možno knižnicu ľahko použiť na overenie hesla. Poskytnuté pravidlá pokrývajú väčšinu bežných spôsobov zaistenia bezpečnosti hesla.

Mali by sme však pamätať na to, že samotná knižnica Passay nezabezpečuje naše heslo. Najprv by sme sa mali dozvedieť, čo sú všeobecné pravidlá, a potom ich implementovať pomocou knižnice.

Všetky príklady, ako vždy, nájdete na GitHub.