Vodič za Passay

1. Uvod

U današnje vrijeme većina web aplikacija ima svoju politiku lozinke - koja je, jednostavno rečeno, stvorena kako bi prisilila korisnike na stvaranje teško lomljivih lozinki.

Da bismo generirali takve lozinke ili ih provjerili, možemo koristiti Passay knjižnicu.

2. Ovisnost Mavena

Ako želimo koristiti Passay knjižnicu u našem projektu, potrebno je dodati sljedeću ovisnost o našoj pom.xml:

 org.prolazni prolaz 1.3.1 

Možemo ga pronaći ovdje.

3. Provjera lozinke

Provjera lozinke jedna je od dvije glavne funkcionalnosti koje pruža Passay knjižnica. Jednostavan je i intuitivan. Otkrijmo to.

3.1. PasswordData

Da bismo potvrdili svoju lozinku, trebali bismo je koristiti PasswordData. To je spremnik za informacije potrebne za provjeru valjanosti. Može pohraniti podatke kao što su:

  • zaporka
  • Korisničko ime
  • popis referenci lozinki
  • podrijetlo

Svojstva lozinke i korisničkog imena objašnjavaju se. Knjižnica Passay nam daje HistoricalReference i SourceReference koje možemo dodati na popis referenci lozinki.

Podrijetlo možemo koristiti za čuvanje podataka o tome je li lozinku generirao ili definirao korisnik.

3.2. PasswordValidator

Trebali bismo znati da trebamo PasswordData i PasswordValidator objekata za početak provjere lozinki. Već smo razgovarali PasswordData. Stvarajmo PasswordValidator sada.

Prvo, trebali bismo definirati skup pravila za provjeru valjanosti lozinke. Moramo ih predati konstruktoru dok stvaramo a PasswordValidator objekt:

PasswordValidator passwordValidator = novi PasswordValidator (novo LengthRule (5));

Postoje dva načina prosljeđivanja naše lozinke na PasswordData objekt. Prosljeđujemo je ili konstruktoru ili metodi postavljača:

PasswordData passwordData = novi PasswordData ("1234"); PasswordData passwordData2 = novi PasswordData (); passwordData.setPassword ("1234");

Lozinku možemo potvrditi pozivom potvrditi () metoda na PasswordValidator:

RuleResult validate = passwordValidator.validate (passwordData);

Kao rezultat, dobit ćemo Rezultat pravila objekt.

3.3. Rezultat pravila

Rezultat pravila sadrži zanimljive informacije o postupku provjere valjanosti. Dolazi kao rezultat potvrditi () metoda.

Prije svega, može nam reći je li lozinka valjana:

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

Štoviše, možemo saznati koje se pogreške vraćaju kada je lozinka nevaljana. Šifre pogrešaka i opisi provjere valjanosti čuvaju se u 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"));

Konačno, možemo istražiti metapodatke provjere valjanosti lozinke pomoću RuleResultMetadata:

Cijelo duljinaCount = provjera valjanosti .getMetadata () .getCounts () .get (RuleResultMetadata.CountCategory.Length); Assert.assertEquals (Integer.valueOf (4), lengthCount);

4. Generiranje lozinke

Uz provjeru valjanosti, Passay knjižnica omogućuje nam generiranje lozinki. Možemo pružiti pravila koja bi generator trebao koristiti.

Da bismo generirali lozinku, trebamo imati PasswordGenerator objekt. Jednom kad ga dobijemo, zovemo generiraj lozinku () metoda i popis prolaza Pravila karaktera. Evo primjera koda:

Znamenke CharacterRule = nove CharacterRule (EnglishCharacterData.Digit); PasswordGenerator passwordGenerator = novi PasswordGenerator (); Niz lozinke = passwordGenerator.generatePassword (10, znamenki); Assert.assertTrue (password.length () == 10); Assert.assertTrue (containsOnlyCharactersFromSet (lozinka, "0123456789"));

Trebali bismo znati da nam je potreban objekt Podaci o liku stvoriti Pravilo karaktera. Još je jedna zanimljiva činjenica da nas knjižnica nudi EnglishCharacterData. To je nabrajanje od pet skupova znakova:

  • znamenke
  • mala engleska abeceda
  • velika engleska abeceda
  • kombinacija malih i velikih slova
  • posebni znakovi

Međutim, ništa nas ne može spriječiti u definiranju našeg skupa likova. To je jednako jednostavno kao i provedba Podaci o liku sučelje. Pogledajmo kako to možemo učiniti:

CharacterRule specialCharacterRule = new CharacterRule (new CharacterData () {@Override public String getErrorCode () {return "SAMPLE_ERROR_CODE";} @Override public String getCharacters () {return "[email protected] #";}}); PasswordGenerator passwordGenerator = novi PasswordGenerator (); Niz lozinke = passwordGenerator.generatePassword (10, specialCharacterRule); Assert.assertTrue (containsOnlyCharactersFromSet (lozinka, "[e-pošta zaštićena] #"));

5. Pozitivna pravila podudaranja

Već smo naučili kako možemo generirati i provjeriti lozinke. Da bismo to učinili, moramo definirati skup pravila. Iz tog razloga trebali bismo znati da u sustavu postoje dvije vrste pravila Passay: pravila pozitivnog podudaranja i pravila negativnog podudaranja.

Prvo, saznajmo koja su pozitivna pravila i kako ih možemo koristiti.

Pravila pozitivnog podudaranja prihvaćaju lozinke koje sadrže predviđene znakove, regularne izraze ili stane u neka ograničenja.

Postoji šest pravila pozitivnog podudaranja:

  • AllowedCharacterRule - definira sve znakove koje lozinka mora sadržavati
  • DopuštenoRegexRule - definira regularni izraz kojem se lozinka mora podudarati
  • Pravilo karaktera - definira skup znakova i minimalan broj znakova koji trebaju biti uključeni u lozinku
  • LengthRule - definira minimalnu duljinu lozinke
  • Pravilo karakternih karakteristika - provjerava ispunjava li lozinka N definiranih pravila.
  • LengthComplexityRule - omogućuje nam definiranje različitih pravila za različite duljine lozinki

5.1. Jednostavna pozitivna pravila podudaranja

Sada ćemo pokriti sva pravila koja imaju jednostavnu konfiguraciju. Oni definiraju skup pravnih znakova ili obrazaca ili prihvatljivu duljinu lozinke.

Evo kratkog primjera raspravljanih pravila:

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

Vidimo da nam svako pravilo daje jasno objašnjenje ako lozinka nije valjana. Postoje obavijesti da je lozinka prekratka i da ima dva nedozvoljena znaka. Također možemo primijetiti da lozinka ne odgovara navedenom regularnom izrazu.

Štoviše, obaviješteni smo da sadrži nedovoljno malih slova.

5.2. Pravilo karakteraKarakteristike

CharcterCharacterisitcsRule je složeniji od pravila predstavljenih prije. Za stvaranje a CharcterCharacterisitcsRule objekt, moramo dostaviti popis Pravilo karakteras. Štoviše, moramo postaviti koliko od njih lozinka mora odgovarati. To možemo učiniti na ovaj način:

CharacterCharacteristicsRule characterCharacteristicsRule = novo CharacterCharacteristicsRule (3, novo CharacterRule (EnglishCharacterData.LowerCase, 5), novo CharacterRule (EnglishCharacterData.UpperCase, 5), novo CharacterRule (EnglishCharacterData.Digitical)

Predstavili Pravilo karakternih karakteristika zahtijeva lozinku koja sadrži tri od četiri navedena pravila.

5.3. LengthComplexityRule

S druge strane, Passay knjižnica nam pruža LengthComplexityRule. Omogućuje nam definiranje pravila koja se trebaju primijeniti na lozinku koje duljine. Za razliku od Pravilo karakternih karakteristika, omogućuju nam korištenje svih vrsta pravila - ne samo Pravilo karaktera.

Analizirajmo primjer:

LengthComplexityRule lengthComplexityRule = novo LengthComplexityRule (); lengthComplexityRule.addRules ("[1,5]", novo pravilo znakova (EnglishCharacterData.LowerCase, 5)); lengthComplexityRule.addRules ("[6,10]", novo dopušteno znakovno pravilo (novi znak [] {'a', 'b', 'c', 'd'}));

Kao što vidimo za lozinku koja ima jedan do pet znakova, primjenjujemo se Pravilo karaktera. Ali za lozinku koja sadrži šest do deset znakova, želimo da se lozinka podudara AllowedCharacterRule.

6. Negativna pravila podudaranja

Za razliku od pravila pozitivnog podudaranja, pravila negativnog podudaranja odbijaju lozinke koje sadrže predviđene znakove, regularne izraze, unose itd.

Otkrijmo koja su pravila negativnog podudaranja:

  • IllegalCharacterRule - definira sve znakove koje lozinka ne smije sadržavati
  • IlegalRegexRule - definira regularni izraz koji se ne smije podudarati
  • IllegalSequenceRule - provjerava ima li lozinka ilegalni redoslijed znakova
  • NumberRangeRule - definira raspon brojeva koje lozinka ne smije sadržavati
  • Pravilo za razmak - provjerava sadrži li lozinka razmake
  • RječnikRule - provjerava je li lozinka jednaka bilo kojem zapisu iz rječnika
  • DictionarySubstringRule - provjerava sadrži li lozinka bilo koji zapis iz rječnika
  • Pravilo povijesti - provjerava sadrži li lozinka neku povijesnu referencu lozinke
  • DigestHistoryRule - provjerava sadrži li lozinka probavljenu povijesnu referencu lozinke
  • IzvorRule - provjerava sadrži li lozinka referencu izvorne lozinke
  • DigestSourceRule - provjerava sadrži li lozinka referencu izvorne lozinke sažetka
  • Korisničko pravilo - provjerava sadrži li lozinka korisničko ime
  • RepeatCharacterRegexRule - provjerava sadrži li lozinka ponovljeno ASCII likova

6.1. Jednostavna pravila negativnog podudaranja

Prvo, vidjet ćemo kako možemo koristiti jednostavna pravila poput IllegalCharacterRule, IlegalRegexRuleitd. Evo kratkog primjera:

PasswordValidator passwordValidator = novi PasswordValidator (novo IllegalCharacterRule (novi znak [] {'a'}), novo NumberRangeRule (1, 10), novo WhitespaceRule ()); RuleResult validate = passwordValidator.validate (novi PasswordData ("abcd22")); assertFalse (validate.isValid ()); assertEquals ("ILLEGAL_CHAR: {legalCharacter = a, matchBehavior = contains}", getDetail (provjera valjanosti, 0)); assertEquals ("ILLEGAL_NUMBER_RANGE: {broj = 2, matchBehavior = sadrži}", getDetail (provjera valjanosti, 4)); assertEquals ("ILLEGAL_WHITESPACE: {whitespaceCharacter =, matchBehavior = sadrzi}", getDetail (provjera valjanosti, 5));

Primjer nam pokazuje kako funkcioniraju opisana pravila. Slično pravilima pozitivnog podudaranja, oni nam daju pune povratne informacije o provjeri valjanosti.

6.2. Pravila rječnika

Što ako želimo provjeriti je li lozinka jednaka navedenim riječima.

Iz tog razloga, Passay knjižnica nam daje izvrsne alate za to. Otkrijmo RječnikRule i DictionarySubstringRule:

WordListDictionary wordListDictionary = novi WordListDictionary (novi ArrayWordList (novi niz [] {"bar", "foobar"})); DictionaryRule dictionaryRule = novi DictionaryRule (wordListDictionary); DictionarySubstringRule dictionarySubstringRule = novo DictionarySubstringRule (wordListDictionary);

Vidimo da nam rječnička pravila omogućuju popis zabranjenih riječi. Korisno je kada imamo popis najčešćih ili najlakših za lomljenje lozinki. Stoga je razumno zabraniti korisnicima da ih koriste.

U stvarnom bismo životu zasigurno učitali popis riječi iz tekstualne datoteke ili baze podataka. U tom slučaju možemo koristiti Popisi riječi. Ima tri preopterećene metode koje uzimaju niz Čitačs i stvoriti ArrayWordList.

6.3. Pravilo povijesti i IzvorRule

Nadalje, Passay knjižnica nam daje Pravilo povijesti i IzvorRule. Mogu provjeriti valjanost lozinki prema povijesnim lozinkama ili tekstualnom sadržaju iz različitih izvora.

Pogledajmo primjer:

SourceRule sourceRule = novo SourceRule (); HistoryRule historyRule = novo HistoryRule (); PasswordData passwordData = novi PasswordData ("123"); passwordData.setPasswordReferences (nova PasswordData.SourceReference ("izvor", "lozinka"), nova PasswordData.HistoricalReference ("12345")); PasswordValidator passwordValidator = novi PasswordValidator (historyRule, sourceRule);

Pravila povijesti pomozite nam provjeriti je li lozinka korištena prije. Budući da su takvi postupci nesigurni, ne želimo da korisnici koriste stare lozinke.

S druge strane, IzvorRule omogućuje nam provjeru razlikuje li se lozinka od one koja je navedena u Izvorne reference. Možemo izbjeći rizik da imamo iste lozinke u različitim sustavima ili aplikacijama.

Vrijedno je spomenuti da postoje takva pravila kao DigestSourceRule i DigestHistoryRule. Obradit ćemo ih u sljedećem odlomku.

6.4. Pravila probavljanja

Postoje dva sažetka pravila u Passay knjižnica: DigestHistoryRule i DigestSourceRule. Pravila sažetka namijenjena su radu s lozinkama pohranjenim u obliku sažetka ili raspršivanja. Stoga, da bismo ih definirali, moramo pružiti EncodingHashBean objekt.

Pogledajmo kako se to radi:

Popis historicalReferences = Arrays.asList (nova PasswordData.HistoricalReference ("SHA256", "2e4551de804e27aacf20f9df5be3e8cd384ed64488b21ab079fb58e8c90068ab")); EncodingHashBean encodingHashBean = novi EncodingHashBean (novi CodecSpec ("Base64"), novi DigestSpec ("SHA256"), 1, false); 

Ovaj put stvaramo HistoricalReference oznakom i kodiranom lozinkom za konstruktor. Nakon toga smo napravili instancu EncodingHashBean s odgovarajućim algoritmom Codec i digesta.

Uz to možemo odrediti broj iteracija i je li algoritam soljen.

Jednom, kad imamo grah za kodiranje, možemo provjeriti svoju sažetku zaporke:

PasswordData passwordData = novi PasswordData ("primjer!"); passwordData.setPasswordReferences (historicalReferences); PasswordValidator passwordValidator = novi PasswordValidator (novo DigestHistoryRule (encodingHashBean)); RuleResult validate = passwordValidator.validate (passwordData); Assert.assertTrue (validate.isValid ());

Možemo saznati više o EncodingHashinBean na web stranici knjižnice Cryptacular.

6.5. RepeatCharacterRegexRule

Još jedno zanimljivo pravilo provjere valjanosti je RepeatCharacterRegexRule. Pomoću nje možemo provjeriti sadrži li lozinka ponavljanje ASCII likova.

Evo primjera koda:

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

6.6. Korisničko pravilo

Posljednje pravilo o kojem ćemo raspravljati u ovom poglavlju je Korisničko pravilo. Omogućuje nam zabranu upotrebe korisničkog imena u lozinci.

Kao što smo već naučili, trebali bismo pohraniti korisničko ime u PasswordData:

PasswordValidator passwordValidator = novi PasswordValidator (novo UsernameRule ()); PasswordData passwordData = novi PasswordData ("testuser1234"); passwordData.setUsername ("testuser"); RuleResult validate = passwordValidator.validate (passwordData); assertFalse (validate.isValid ()); assertEquals ("ILLEGAL_USERNAME: {korisničko ime = testuser, matchBehavior = sadrzi}", getDetail (provjera valjanosti, 0));

7. Prilagođene poruke

Passay Biblioteka nam omogućuje prilagodbu poruka vraćenih pravilima provjere valjanosti. Prvo, trebali bismo definirati poruke i dodijeliti ih kodovima pogrešaka.

Možemo ih staviti u jednostavnu datoteku. Da vidimo kako je lako:

TOO_LONG = Lozinka ne smije imati više znakova od% 2 $ s. TOO_SHORT = Lozinka ne smije sadržavati manje znakova od% 2 $ s.

Nakon što imamo poruke, moramo učitati tu datoteku. Napokon, možemo to prenijeti u PasswordValidator objekt.

Evo primjera koda:

URL resurs = this.getClass (). GetClassLoader (). GetResource ("messages.properties"); Osobine svojstva = novi Svojstva (); props.load (novi FileInputStream (resource.getPath ())); Razrješivač MessageResolver = novi PropertiesMessageResolver (rekviziti); 

Kao što vidimo, učitali smo poruka.svojstva datoteku i proslijedio je u Svojstva objekt. Tada možemo koristiti Svojstva objekt za stvaranje SvojstvaMessageResolver.

Pogledajmo primjer kako se koristi razrješivač poruka:

PasswordValidator validator = novi PasswordValidator (razrješivač, novo LengthRule (8, 16), novo WhitespaceRule ()); RuleResult tooShort = validator.validate (novi PasswordData ("XXXX")); RuleResult tooLong = validator.validate (novi PasswordData ("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ")); Assert.assertEquals ("Lozinka ne smije sadržavati manje znakova od 16.", validator.getMessages (tooShort) .get (0)); Assert.assertEquals ("Lozinka ne smije imati više znakova od 16.", validator.getMessages (tooLong) .get (0));

Primjer jasno pokazuje da sve kodove pogrešaka možemo prevesti s validatorom opremljenim rješivačem poruka.

8. Zaključak

U ovom uputstvu naučili smo kako ga koristiti Passay knjižnica. Analizirali smo nekoliko primjera kako se knjižnica lako može koristiti za provjeru valjanosti lozinke. Navedena pravila pokrivaju većinu uobičajenih načina osiguranja sigurnosti lozinke.

Ali trebali bismo imati na umu da sama knjižnica Passay ne čini našu lozinku sigurnom. Prvo, trebali bismo naučiti koja su opća pravila, a zatim koristiti knjižnicu za njihovu primjenu.

Svi primjeri, kao i uvijek, mogu se naći na GitHubu.