Útmutató a Passay-hoz

1. Bemutatkozás

Manapság a legtöbb webalkalmazásnak van jelszópolitikája - amelyet egyszerűen úgy hozunk létre, hogy arra kényszerítse a felhasználókat, hogy nehezen törhető jelszavakat hozzanak létre.

Az ilyen jelszavak előállításához vagy érvényesítéséhez felhasználhatjuk a Passay könyvtárat.

2. Maven-függőség

Ha a projektünkben a Passay könyvtárat akarjuk használni, akkor hozzá kell adnunk a következő függőséget pom.xml:

 org.passay passay 1.3.1 

Itt megtalálhatjuk.

3. Jelszó érvényesítése

A jelszó érvényesítése a Passay könyvtár két fő funkciójának egyike. Könnyű és intuitív. Fedezzük fel.

3.1. PasswordData

Jelszavunk érvényesítéséhez használnunk kell PasswordData. Ez az ellenőrzéshez szükséges információk tárolója. Olyan adatokat tárolhat, mint:

  • Jelszó
  • felhasználónév
  • jelszó hivatkozások listája
  • eredet

A jelszó és a felhasználónév tulajdonságai megmagyarázzák magukat. A Passay könyvtár ad nekünk HistoricalReference és SourceReference amelyet felvehetünk a jelszó hivatkozások listájába.

Az origó mező segítségével információt tárolhatunk arról, hogy a jelszót egy felhasználó generálta-e vagy határozta meg.

3.2. PasswordValidator

Tudnunk kell, hogy szükségünk van rá PasswordData és PasswordValidator objektumok a jelszavak érvényesítésének megkezdéséhez. Már megbeszéltük PasswordData. Alkossunk PasswordValidator Most.

Először is meg kell határoznunk a jelszó érvényesítésének szabályait. Át kell adnunk őket a kivitelezőnek, miközben létrehozunk egy PasswordValidator tárgy:

PasswordValidator passwordValidator = új PasswordValidator (új LengthRule (5));

Kétféle módon adhatjuk át jelszavunkat a PasswordData tárgy. Vagy a konstruktornak, vagy a szetter metódusnak adjuk át:

PasswordData passwordData = új PasswordData ("1234"); PasswordData passwordData2 = új PasswordData (); passwordData.setPassword ("1234");

Hívással ellenőrizhetjük jelszavunkat érvényesít() módszer be PasswordValidator:

RuleResult validate = passwordValidator.validate (passwordData);

Ennek eredményeként kapunk egy RuleResult tárgy.

3.3. RuleResult

RuleResult érdekes információkat tartalmaz az érvényesítési folyamatról. Ennek eredményeként jön létre érvényesít() módszer.

Először is meg tudja mondani, hogy a jelszó érvényes-e:

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

Sőt, megtudhatjuk, hogy milyen hibák adódnak vissza, ha a jelszó érvénytelen. A hibakódokat és az érvényesítési leírásokat a rendszer tárolja 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"));

Végül felfedezhetjük a jelszó érvényesítés metaadatait RuleResultMetadata:

Egész szám lengthCount = érvényesítés .getMetadata () .getCounts () .get (RuleResultMetadata.CountCategory.Length); Assert.assertEquals (Integer.valueOf (4), lengthCount);

4. Jelszógenerálás

Az érvényesítés mellett a Passay könyvtár lehetővé teszi számunkra a jelszavak előállítását. Biztosíthatunk szabályokat, amelyeket a generátornak használnia kell.

A jelszó előállításához rendelkeznünk kell a PasswordGenerator tárgy. Miután megvan, hívjuk a generatorPassword () módszer és az átadási lista CharacterRules. Itt van egy minta kód:

CharacterRule számjegy = new CharacterRule (EnglishCharacterData.Digit); PasswordGenerator passwordGenerator = új PasswordGenerator (); Karakterlánc jelszó = passwordGenerator.generatePassword (10, számjegy); Assert.assertTrue (jelszó.hossz () == 10); Assert.assertTrue (tartalmazzaOnlyCharactersFromSet (jelszó, "0123456789"));

Tudnunk kell, hogy szükségünk van egy tárgyra CharacterData készíteni CharacterRule. Egy másik érdekes tény, hogy a könyvtár biztosít számunkra EnglishCharacterData. Öt karakterkészletből áll:

  • számjegyeket
  • kisbetűs angol ábécé
  • nagybetűs angol ábécé
  • kis- és nagybetűk kombinációja
  • speciális karakterek

Semmi sem akadályozhat meg minket a karakterkészlet meghatározásában. Ugyanolyan egyszerű, mint a CharacterData felület. Lássuk, hogyan tehetjük meg:

CharacterRule specialCharacterRule = new CharacterRule (new CharacterData () {@Orride public String getErrorCode () {return "SAMPLE_ERROR_CODE";} @Orride public String getCharacters () {return "[email protected] #";}}}); PasswordGenerator passwordGenerator = új PasswordGenerator (); Karakterlánc jelszó = passwordGenerator.generatePassword (10, specialCharacterRule); Assert.assertTrue (tartalmazzaOnlyCharactersFromSet (jelszó, "[email protected] #"));

5. Pozitív egyeztetési szabályok

Már megtanultuk, hogyan állíthatunk elő és érvényesíthetünk jelszavakat. Ehhez meg kell határoznunk egy szabályrendszert. Ezért tudnunk kell, hogy kétféle szabály érhető el Passay: pozitív illesztési szabályok és negatív illesztési szabályok.

Először derítsük ki, melyek a pozitív szabályok, és hogyan tudjuk felhasználni őket.

A pozitív egyezési szabályok elfogadják azokat a jelszavakat, amelyek megadott karaktereket, reguláris kifejezéseket vagy bizonyos korlátozásokba illeszkednek.

Hat pozitív egyezési szabály létezik:

  • AllowedCharacterRule - meghatározza az összes karaktert, amelyet a jelszónak tartalmaznia kell
  • AllowedRegexRule - meghatároz egy reguláris kifejezést, amelynek a jelszónak meg kell egyeznie
  • CharacterRule - meghatároz egy karakterkészletet és egy minimális számú karaktert, amelyet fel kell venni a jelszóba
  • LengthRule - meghatározza a jelszó minimális hosszát
  • CharacterCharacteristicsRule - ellenőrzi, hogy a jelszó megfelel-e N meghatározott szabályok.
  • LengthComplexityRule - lehetővé teszi számunkra, hogy különböző szabályokat határozzunk meg a különböző jelszóhosszakhoz

5.1. Egyszerű pozitív egyeztetési szabályok

Most áttekintjük az összes egyszerű konfigurációjú szabályt. Meghatározzák a legális karakterek vagy minták készletét, vagy elfogadható jelszóhosszt.

Íme egy rövid példa a tárgyalt szabályokra:

PasswordValidator passwordValidator = új PasswordValidator (új AllowedCharacterRule (új char [] {'a', 'b', 'c'}), új CharacterRule (EnglishCharacterData.LowerCase, 5), új LengthRule (8, 10)); RuleResult validate = passwordValidator.validate (új PasswordData ("12abc")); assertFalse (validate.isValid ()); assertEquals ("ALLOWED_CHAR: {illegálisCharacter = 1, matchBehavior = tartalmazza}", getDetail (érvényesítés, 0)); assertEquals ("ALLOWED_CHAR: {illegálisCharacter = 2, matchBehavior = tartalmazza}", getDetail (érvényesítés, 1)); assertEquals ("TOO_SHORT: {minimumLength = 8, maximumLength = 10}", getDetail (érvényesítés, 4));

Láthatjuk, hogy minden szabály egyértelmű magyarázatot ad nekünk, ha a jelszó nem érvényes. Értesülések szerint a jelszó túl rövid, és két illegális karaktert tartalmaz. Azt is észrevehetjük, hogy a jelszó nem egyezik a megadott reguláris kifejezéssel.

Sőt, arról értesülünk, hogy nem tartalmaz elegendő kisbetűt.

5.2. CharacterCharacterisitcsRule

CharcterCharacterisitcsRule összetettebb, mint a korábban bemutatott szabályok. A CharcterCharacterisitcsRule objektumot, meg kell adnunk egy listát CharacterRules. Sőt, meg kell adnunk, hogy a jelszónak hányuknak kell egyeznie. Megtehetjük így:

CharacterCharacteristicsRule characterCharacteristicsRule = new CharacterCharacteristicsRule (3, new CharacterRule (EnglishCharacterData.LowerCase, 5), new CharacterRule (EnglishCharacterData.UpperCase, 5), new CharacterRule (EnglishCharacterData.Digit), new CharacterRata (English)

Bemutatták CharacterCharacteristicsRule jelszó szükséges a megadott négy szabályból hármat tartalmazni.

5.3. LengthComplexityRule

Másrészről, Passay könyvtár biztosítja számunkra LengthComplexityRule. Ez lehetővé teszi számunkra, hogy meghatározzuk, mely szabályokat kell alkalmazni, milyen hosszúságú jelszóra. Szemben CharacterCharacteristicsRule, lehetővé teszik számunkra, hogy mindenféle szabályt alkalmazzunk - nemcsak CharacterRule.

Elemezzük a példát:

LengthComplexityRule lengthComplexityRule = új LengthComplexityRule (); lengthComplexityRule.addRules ("[1,5]", új CharacterRule (EnglishCharacterData.LowerCase, 5)); lengthComplexityRule.addRules ("[6,10]", új AllowedCharacterRule (új karakter [] {'a', 'b', 'c', 'd'}));

Amint láthatjuk az egy-öt karakterből álló jelszót, alkalmazzuk CharacterRule. Hat-tíz karaktert tartalmazó jelszó esetén azonban azt akarjuk, hogy a jelszó egyezzen AllowedCharacterRule.

6. Negatív egyeztetési szabályok

A pozitív egyezési szabályokkal ellentétben a negatív illesztési szabályok elutasítják a megadott karaktereket, reguláris kifejezéseket, bejegyzéseket stb. Tartalmazó jelszavakat.

Nézzük meg, melyek a negatív egyezési szabályok:

  • IllegalCharacterRule - meghatározza az összes karaktert, amelyet egy jelszó nem tartalmazhat
  • IllegalRegexRule - meghatároz egy reguláris kifejezést, amelynek nem szabad egyeznie
  • IllegalSequenceRule - ellenőrzi, hogy egy jelszónak illegális karaktersorozata van-e
  • NumberRangeRule - meghatározza a számok tartományát, amelyet a jelszó nem tartalmazhat
  • WhitespaceRule - ellenőrzi, hogy a jelszó tartalmaz-e szóközöket
  • DictionaryRule - ellenőrzi, hogy a jelszó megegyezik-e bármely szótár rekordjával
  • DictionarySubstringRule - ellenőrzi, hogy egy jelszó tartalmaz-e szótárrekordot
  • HistoryRule - ellenőrzi, hogy egy jelszó tartalmaz-e valamilyen korábbi jelszó hivatkozást
  • DigestHistoryRule - ellenőrzi, hogy a jelszó tartalmaz-e valamilyen emésztett jelszó hivatkozást
  • SourceRule - ellenőrzi, hogy egy jelszó tartalmaz-e valamilyen forrásjelszó hivatkozást
  • DigestSourceRule - ellenőrzi, hogy egy jelszó tartalmaz-e összefoglaló forrásjelszó hivatkozást
  • Felhasználónév szabály - ellenőrzi, hogy egy jelszó tartalmaz-e felhasználónevet
  • RepeatCharacterRegexRule - ellenőrzi, hogy egy jelszó tartalmaz-e ismételteket ASCII karakterek

6.1. Egyszerű negatív illesztési szabályok

Először meg fogjuk nézni, hogyan használhatunk olyan egyszerű szabályokat, mint pl IllegalCharacterRule, IllegalRegexRulestb. Itt van egy rövid példa:

PasswordValidator passwordValidator = új PasswordValidator (új IllegalCharacterRule (új char [] {'a'}}), új NumberRangeRule (1, 10), új WhitespaceRule ()); RuleResult validate = passwordValidator.validate (új PasswordData ("abcd22")); assertFalse (validate.isValid ()); assertEquals ("ILLEGAL_CHAR: {illegálisKarakter = a, matchBehavior = tartalmazza}", getDetail (érvényesítés, 0)); assertEquals ("ILLEGAL_NUMBER_RANGE: {szám = 2, matchBehavior = tartalmaz}", getDetail (érvényesítés, 4)); assertEquals ("ILLEGAL_WHITESPACE: {whitespaceCharacter =, matchBehavior = tartalmaz}", getDetail (érvényesítés, 5));

A példa megmutatja, hogyan működnek a leírt szabályok. A pozitív egyezési szabályokhoz hasonlóan teljes visszajelzést adnak nekünk az érvényesítésről.

6.2. Szótárszabályok

Mi van, ha ellenőrizni akarjuk, hogy a jelszó nem egyenlő-e a megadott szavakkal.

Emiatt a Passay könyvtár kiváló eszközöket nyújt ehhez. Fedezzük fel DictionaryRule és DictionarySubstringRule:

WordListDictionary wordListDictionary = új WordListDictionary (új ArrayWordList (új String [] {"bar", "foobar"})); DictionaryRule dictionaryRule = új DictionaryRule (wordListDictionary); DictionarySubstringRule dictionarySubstringRule = új DictionarySubstringRule (wordListDictionary);

Láthatjuk, hogy a szótár szabályai lehetővé teszik számunkra a tiltott szavak felsorolását. Akkor előnyös, ha van egy listánk a leggyakoribb vagy legkönnyebben feltörhető jelszavakról. Ezért ésszerű megtiltani a felhasználóknak a használatukat.

A való életben minden bizonnyal betöltenénk egy szavak listáját egy szöveges fájlból vagy egy adatbázisból. Ebben az esetben használhatjuk WordLists. Három túlterhelt módszerrel rendelkezik, amelyek tömböt vesznek fel Olvasós létrehozni ArrayWordList.

6.3. HistoryRule és SourceRule

Továbbá a Passay könyvtár ad nekünk HistoryRule és SourceRule. Ellenőrizni tudják a jelszavakat a korábbi jelszavak vagy a különböző forrásokból származó szöveges tartalmak alapján.

Vessünk egy pillantást a példára:

SourceRule sourceRule = new SourceRule (); HistoryRule historyRule = új HistoryRule (); PasswordData passwordData = új PasswordData ("123"); passwordData.setPasswordReferences (új PasswordData.SourceReference ("forrás", "jelszó"), új PasswordData.HistoricalReference ("12345"); PasswordValidator passwordValidator = új PasswordValidator (historyRule, sourceRule);

HistoryRules segítsen ellenőrizni, hogy használt-e már jelszót. Mivel az ilyen gyakorlatok bizonytalanok, nem akarjuk, hogy a felhasználók a régi jelszavakat használják.

Másrészről, SourceRule lehetővé teszi számunkra, hogy ellenőrizzük, hogy a jelszó eltér-e a megadottól SourceReferences. Elkerülhetjük annak kockázatát, hogy ugyanazok a jelszavak legyenek különböző rendszerekben vagy alkalmazásokban.

Érdemes megemlíteni, hogy vannak olyan szabályok, mint DigestSourceRule és DigestHistoryRule. A következő bekezdésben foglalkozunk velük.

6.4. Digest szabályok

Két összefoglaló szabály van a Passay könyvtár: DigestHistoryRule és DigestSourceRule. Az összefoglaló szabályok célja az összefoglalásként vagy kivonatként tárolt jelszavak működése. Ezért ezek definiálásához meg kell adnunk egy EncodingHashBean tárgy.

Lássuk, hogyan történik:

List historyReferences = Arrays.asList (új PasswordData.HistoricalReference ("SHA256", "2e4551de804e27aacf20f9df5be3e8cd384ed64488b21ab079fb58e8c90068ab"); EncodingHashBean encodingHashBean = new EncodingHashBean (új CodecSpec ("Base64"), új DigestSpec ("SHA256"), 1, hamis); 

Ezúttal mi alkotunk HistoricalReference címkével és a konstruktor kódolt jelszavával. Ezek után példányosítottunk EncodingHashBean a megfelelő kodek és összefoglaló algoritmussal.

Ezenkívül megadhatjuk az iterációk számát és azt, hogy az algoritmus sózott-e.

Ha van egy kódoló babunk, ellenőrizhetjük az összefoglaló jelszavunkat:

PasswordData passwordData = új PasswordData ("példa!"); passwordData.setPasswordReferences (historicalReferences); PasswordValidator passwordValidator = új PasswordValidator (új DigestHistoryRule (encodingHashBean)); RuleResult validate = passwordValidator.validate (passwordData); Assert.assertTrue (validate.isValid ());

Többet megtudhatunk EncodingHashinBean a Cryptacular könyvtár weboldalán.

6.5. RepeatCharacterRegexRule

Egy másik érdekes érvényesítési szabály az RepeatCharacterRegexRule. Használhatjuk annak ellenőrzésére, hogy a jelszó tartalmaz-e ismétlődést ASCII karakterek.

Íme egy példa kód:

PasswordValidator passwordValidator = új PasswordValidator (új RepeatCharacterRegexRule (3)); RuleResult validate = passwordValidator.validate (új PasswordData ("aaabbb")); assertFalse (validate.isValid ()); assertEquals ("ILLEGAL_MATCH: {match = aaa, pattern = ([^ \ x00 - \ x1F]) \ 1 {2}}", getDetail (érvényesítés, 0));

6.6. Felhasználónév szabály

Az utolsó szabály, amelyet ebben a fejezetben megvitatunk, az Felhasználónév szabály. Lehetővé teszi számunkra, hogy megtiltsuk a felhasználói név használatát a jelszóban.

Amint azt már korábban megtudtuk, a felhasználónevet itt kell tárolnunk PasswordData:

PasswordValidator passwordValidator = új PasswordValidator (új felhasználónévRule ()); PasswordData passwordData = új PasswordData ("testuser1234"); passwordData.setUsername ("testuser"); RuleResult validate = passwordValidator.validate (passwordData); assertFalse (validate.isValid ()); assertEquals ("ILLEGAL_USERNAME: {felhasználónév = testuser, matchBehavior = tartalmaz}", getDetail (érvényesítés, 0));

7. Testreszabott üzenetek

Passay könyvtár lehetővé teszi számunkra, hogy testre szabjuk az érvényesítési szabályok által visszaadott üzeneteket. Először is meg kell határoznunk az üzeneteket, és hibakódokhoz kell rendelnünk őket.

Betehetjük őket egy egyszerű fájlba. Lássuk, milyen könnyű:

TOO_LONG = A jelszónak nem lehet több karaktere, mint% 2 $ s. TOO_SHORT = A jelszó nem tartalmazhat kevesebb karaktert, mint% 2 $ s.

Ha vannak üzeneteink, be kell töltenünk azt a fájlt. Végül átadhatjuk PasswordValidator tárgy.

Itt van egy minta kód:

URL-erőforrás = this.getClass (). GetClassLoader (). GetResource ("messages.properties"); Tulajdonságok kellékei = új Tulajdonságok (); props.load (új FileInputStream (resource.getPath ())); MessageResolver resolver = new PropertiesMessageResolver (kellékek); 

Mint láthatjuk, betöltöttük a üzenet.tulajdonságok fájlt, és továbbította Tulajdonságok tárgy. Ezután használhatjuk a Tulajdonságok létrehozandó objektum PropertiesMessageResolver.

Vessünk egy pillantást az üzenetfeloldó használatára:

PasswordValidator validator = új PasswordValidator (felbontó, új LengthRule (8, 16), új WhitespaceRule ()); RuleResult tooShort = validator.validate (új PasswordData ("XXXX")); RuleResult tooLong = validator.validate (új PasswordData ("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ")); Assert.assertEquals ("A jelszó legfeljebb 16 karaktert tartalmazhat.", Validator.getMessages (tooShort) .get (0)); Assert.assertEquals ("A jelszónak legfeljebb 16 karakter lehet.", Validator.getMessages (tooLong) .get (0));

A példa világosan mutatja, hogy az összes hibakódot lefordíthatjuk az üzenetfeloldóval felszerelt validátorral.

8. Következtetés

Ebben az oktatóanyagban megtanultuk a használatát Passay könyvtár. Számos példát elemeztünk arra vonatkozóan, hogy a könyvtár hogyan használható könnyen a jelszó érvényesítéséhez. A megadott szabályok lefedik a jelszó biztonságos biztonságának legáltalánosabb módjait.

De emlékeznünk kell arra, hogy a Passay könyvtár maga nem teszi biztonságossá a jelszavunkat. Először meg kell tanulnunk az általános szabályokat, majd a könyvtárat kell használnunk azok megvalósításához.

Minden példa, mint mindig, a GitHubon található.