Generáljon biztonságos véletlenszerű jelszót a Java-ban

Java Top

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Bemutatkozás

Ebben az oktatóanyagban különféle módszereket vizsgálunk meg, amelyek segítségével biztonságos véletlenszerű jelszót generálhatunk a Java-ban.

Példáinkban tíz karakterből álló jelszavakat állítunk elő, amelyek mindegyikében legalább két kisbetű, két nagybetű, két számjegy és két speciális karakter szerepel.

2. A Passay használata

A Passay egy jelszóházirend-végrehajtási könyvtár. Különösen a könyvtárat használhatjuk a jelszó előállításához egy konfigurálható szabálykészlet segítségével.

Az alapértelmezett segítségével CharacterData megvalósítások során megfogalmazhatjuk a jelszóhoz szükséges szabályokat. Továbbá tudjuk megfogalmazza a szokást CharacterData igényeinknek megfelelő megvalósítások:

public String genePassayPassword () {PasswordGenerator gen = new PasswordGenerator (); CharacterData lowerCaseChars = EnglishCharacterData.LowerCase; CharacterRule lowerCaseRule = új CharacterRule (lowerCaseChars); lowerCaseRule.setNumberOfCharacters (2); CharacterData upperCaseChars = EnglishCharacterData.UpperCase; CharacterRule upperCaseRule = új CharacterRule (upperCaseChars); upperCaseRule.setNumberOfCharacters (2); CharacterData digitChars = EnglishCharacterData.Digit; CharacterRule digitRule = new CharacterRule (digitChars); digitRule.setNumberOfCharacters (2); CharacterData specialChars = new CharacterData () {public String getErrorCode () {return ERROR_CODE; } public String getCharacters () {return "[email protected] # $% ^ & * () _ +"; }}; CharacterRule splCharRule = új CharacterRule (specialChars); splCharRule.setNumberOfCharacters (2); Karakterlánc-jelszó = gen.generatePassword (10, splCharRule, lowerCaseRule, upperCaseRule, digitRule); jelszó visszaküldése; }

Itt létrehoztunk egy szokást CharacterData speciális karakterek megvalósítása. Ez lehetővé teszi számunkra, hogy korlátozzuk az érvényes karakterek halmazát.

Ettől eltekintve a CharacterData más szabályainkért.

Most ellenőrizzük a generátorunkat egy egység teszt alapján. Például két speciális karakter jelenlétét ellenőrizhetjük:

@Test public void whenPasswordGeneratedUsingPassay_thenSuccessful () {RandomPasswordGenerator passGen = new RandomPasswordGenerator (); Karakterlánc jelszó = passGen.generatePassayPassword (); int specialCharCount = 0; for (char c: jelszó.toCharArray ()) ha (c> = 33 

Érdemes ezt megjegyezni bár a Passay nyílt forráskódú, kettős licenccel rendelkezik mind az LGPL, mind az Apache 2 alatt. Mint minden harmadik féltől származó szoftver esetében, a termékeinkben történő felhasználáskor is mindenképpen be kell tartanunk ezeket a licenceket. A GNU webhelyén további információk találhatók az LGPL-ről és a Java-ról.

3. Használata RandomStringGenerator

Ezután nézzük meg a RandomStringGenerator az Apache Commons szövegben. Val vel RandomStringGenerator, generálhatunk Unicode karakterláncokat, amelyek a megadott számú kódpontot tartalmazzák.

Most létrehozunk egy példát a generátorról a RandomStringGenerator.Builder osztály. Természetesen a generátor tulajdonságait is tovább manipulálhatjuk.

Az építő segítségével könnyen megváltoztathatjuk a véletlenszerűség alapértelmezett megvalósítását. Ezenkívül meghatározhatjuk a karakterláncban megengedett karaktereket is:

public String geneRandomSpecialCharacters (int hosszúság) {RandomStringGenerator pwdGenerator = új RandomStringGenerator.Builder (). withinRange (33, 45) .build (); return pwdGenerator.generate (hossz); } 

Most a használat egyik korlátozása RandomStringGenerator az, hogy nem tudja megadni az egyes halmazok karaktereinek számát, például a Passay-ben. Ezt azonban megkerülhetjük több halmaz eredményének egyesítésével:

public String generálCommonTextPassword () {Karakterlánc pwString = generálRandomSpecialCharacters (2) .concat (generátorRandomNumbers (2)) .concat (generátorRandomAlphabet (2, igaz)) .concat (generátorRandomAlphabet (2, hamis)) 2concat (2) Sorolja fel a pwChars = pwString.chars () .mapToObj (adatok -> (char) adatok) .collect (Collectors.toList ()); Collections.shuffle (pwChars); Karakterlánc jelszó = pwChars.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); jelszó visszaküldése; }

Ezután ellenőrizzük a generált jelszót a kisbetűk ellenőrzésével:

@Test public void whenPasswordGeneratedUsingCommonsText_thenSuccessful () {RandomPasswordGenerator passGen = new RandomPasswordGenerator (); Karakterlánc jelszó = passGen.generateCommonTextPassword (); int alsóCaseCount = 0; for (char c: password.toCharArray ()) 

Alapértelmezés szerint, RandomStringGenerator felhasználja ThreadLocalRandom a véletlenszerűségért. Most fontos megemlíteni hogy ez nem biztosítja a kriptográfiai biztonságot.

Azonban a véletlenszerűség forrását használhatjuk usingRandom (TextRandomProvider). Például használhatjuk SecureTextRandomProvider titkosítási biztonság:

public String geneRandomSpecialCharacters (int hossz) {SecureTextRandomProvider stp = new SecureTextRandomProvider (); RandomStringGenerator pwdGenerator = új RandomStringGenerator.Builder () .withinRange (33, 45) .usingRandom (stp) .build (); return pwdGenerator.generate (hossz); }

4. Használata RandomStringUtils

Egy másik lehetőség, amelyet alkalmazhatunk, a RandomStringUtils osztály az Apache Commons Lang könyvtárban. Ez az osztály számos statikus módszert tár fel, amelyeket problémamegállapításunkhoz használhatunk.

Nézzük meg, hogyan tudjuk megadni a jelszó számára elfogadható kódpontok tartományát:

 public String generálCommonLangPassword () {String upperCaseLetters = RandomStringUtils.random (2, 65, 90, igaz, igaz); String lowerCaseLetters = RandomStringUtils.random (2, 97, 122, igaz, igaz); Karakterláncok = RandomStringUtils.randomNumeric (2); String specialChar = RandomStringUtils.random (2, 33, 47, hamis, hamis); String totalChars = RandomStringUtils.randomAlphanumeric (2); Karakterlánc kombináltChars = upperCaseLetters.concat (alsóCaseLetters) .concat (számok) .concat (specialChar) .concat (totalChars); Sorolja fel a pwdChars = combinedChars.chars () .mapToObj (c -> (char) c) .collect (Collectors.toList ()); Collections.shuffle (pwdChars); Karakterlánc jelszó = pwdChars.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); jelszó visszaküldése; }

A generált jelszó érvényesítéséhez ellenőrizzük a numerikus karakterek számát:

@Test public void whenPasswordGeneratedUsingCommonsLang3_thenSuccessful () {RandomPasswordGenerator passGen = new RandomPasswordGenerator (); Karakterlánc jelszó = passGen.generateCommonsLang3Password (); int számSzám = 0; for (char c: password.toCharArray ()) 

Itt, RandomStringUtils felhasználja Véletlen alapértelmezés szerint a véletlenszerűség forrása. Van azonban egy módszer a könyvtárban, amely lehetővé teszi a véletlenszerűség forrásának megadását:

String lowerCaseLetters = RandomStringUtils. random (2, 97, 122, true, true, null, new SecureRandom ());

Most a kriptográfiai biztonságot a SecureRandom. Ez a funkció azonban nem bővíthető a könyvtár más módszereire. Mellékesen: Az Apache támogatja a RandomStringUtils csak egyszerű használatra.

5. Egyedi segédprogram módszer használata

Használhatjuk a SecureRandom osztály egy egyéni segédprogram osztály létrehozásához a forgatókönyvünkhöz. Kezdetnek generáljunk egy két hosszúságú speciális karaktert:

public Stream getRandomSpecialChars (int szám) {Random random = new SecureRandom (); IntStream specialChars = random.ints (szám, 33, 45); return specialChars.mapToObj (adatok -> (char) adatok); }

Ezt is vegye észre 33 és 45 jelölje az Unicode karakterek tartományát. Most több adatfolyamot is létrehozhatunk a követelményeinknek megfelelően. Ezután egyesíthetjük az eredményhalmazokat a szükséges jelszó előállításához:

public String geneSecureRandomPassword () {Stream pwdStream = Stream.concat (getRandomNumbers (2), Stream.concat (getRandomSpecialChars (2), Stream.concat (getRandomAlphabets (2, true), getRandomAlphabets) (4, hamis) List charList = pwdStream.collect (Collectors.toList ()); Collections.shuffle (charList); Karakterlánc jelszó = charList.stream () .collect (StringBuilder :: new, StringBuilder :: append, StringBuilder :: append) .toString (); jelszó visszaküldése; } 

Most ellenőrizzük a létrehozott jelszót a speciális karakterek számához:

@Test public void whenPasswordGeneratedUsingSecureRandom_thenSuccessful () {RandomPasswordGenerator passGen = new RandomPasswordGenerator (); Karakterlánc jelszó = passGen.generateSecureRandomPassword (); int specialCharCount = 0; for (char c: jelszó.toCharArray ()) c = 2); 

6. Következtetés

Ebben az oktatóanyagban az igényeinknek megfelelő jelszavakat tudtunk előállítani különböző könyvtárak segítségével.

Mint mindig, a cikkben használt kódminták elérhetők a GitHubon.

Java alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT